Hibernate中双向多对一(一对多)详解

在《Hibernate中多对一详解》一随笔的基础上,修改老师表的结构:

 1 package easyStart.Entity;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 public class Teacher {
 7     private int id;
 8     private String name;
 9     private Set<Student> students = new HashSet<>();
10 
11     public int getId() {
12         return id;
13     }
14 
15     public void setId(int id) {
16         this.id = id;
17     }
18 
19     public String getName() {
20         return name;
21     }
22 
23     public void setName(String name) {
24         this.name = name;
25     }
26 
27     public Set<Student> getStudents() {
28         return students;
29     }
30 
31     public void setStudents(Set<Student> students) {
32         this.students = students;
33     }
34 
35 
36 
37     public Teacher(String name, Set<Student> students) {
38         this.name = name;
39         this.students = students;
40     }
41 
42     public Teacher() {
43     }
44 
45     @Override
46     public String toString() {
47         return "Teacher [id=" + id + ", name=" + name + "]";
48     }
49 
50 }
老师表中增加了学生的集合

对应的映射文件:

 1 <?xml version="1.0"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <!-- Generated 2018-6-12 7:03:00 by Hibernate Tools 3.5.0.Final -->
 5 <hibernate-mapping>
 6     <class name="easyStart.Entity.Teacher" table="t_teacher">
 7         <id name="id" type="int">
 8             <column name="id" />
 9             <generator class="native" />
10         </id>
11         <property name="name" type="java.lang.String">
12             <column name="name" />
13         </property>
14         <set name="students">
15             <key>
16                 <column name="teacher"></column>
17             </key>
18             <one-to-many class="easyStart.Entity.Student"/>
19         </set>
20     </class>
21 </hibernate-mapping>
映射文件

 1 package easyStart.Run;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 import org.hibernate.boot.MetadataSources;
 9 import org.hibernate.boot.registry.StandardServiceRegistry;
10 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
11 
12 import easyStart.Entity.Student;
13 import easyStart.Entity.Teacher;
14 
15 public class QuickStart {
16 
17     public static void main(String[] args) {
18 
19         final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
20         SessionFactory sessionFactory = null;
21         try {
22             sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
23             System.out.println("1");
24         } catch (Exception e) {
25             System.out.println("2");
26             StandardServiceRegistryBuilder.destroy(registry);
27         }
28 
29         Session session = sessionFactory.openSession();
30         session.beginTransaction();
31         // 处理事务 Begin
32 
33         Teacher teacher1 = new Teacher();
34         teacher1.setName("zhangpn");
35         Teacher teacher2 = new Teacher();
36         teacher2.setName("zhangpl");
37         session.save(teacher1); 
38         session.save(teacher2); 
39         Student student1 = new Student("ZhangFang", teacher1);
40         session.save(student1);
41         Student student2 = new Student("Zhangwen", teacher2);
42         session.save(student2);
43         // 处理事务 End
44         session.getTransaction().commit();
45         session.close();
46         sessionFactory.close();
47     }
48 }
java源码

从代码中,看出,我们先保存的老师,后保存的学生;

 1 六月 12, 2018 9:06:16 上午 org.hibernate.Version logVersion
 2 INFO: HHH000412: Hibernate Core {5.0.1.Final}
 3 六月 12, 2018 9:06:16 上午 org.hibernate.cfg.Environment <clinit>
 4 INFO: HHH000206: hibernate.properties not found
 5 六月 12, 2018 9:06:16 上午 org.hibernate.cfg.Environment buildBytecodeProvider
 6 INFO: HHH000021: Bytecode provider name : javassist
 7 六月 12, 2018 9:06:16 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
 8 INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
 9 六月 12, 2018 9:06:16 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
10 WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
11 六月 12, 2018 9:06:17 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
12 WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
13 六月 12, 2018 9:06:17 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
14 WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
15 六月 12, 2018 9:06:17 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
16 INFO: HHH000401: using driver [com.mysql.cj.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/zhangpn?serverTimezone=GMT&useSSL=false]
17 六月 12, 2018 9:06:17 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
18 INFO: HHH000046: Connection properties: {user=root, password=****}
19 六月 12, 2018 9:06:17 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
20 INFO: HHH000006: Autocommit mode: false
21 六月 12, 2018 9:06:17 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
22 INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
23 六月 12, 2018 9:06:17 上午 org.hibernate.dialect.Dialect <init>
24 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
25 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
26 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
27 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
28 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
29 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
30 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
31 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
32 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
33 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
34 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
35 六月 12, 2018 9:06:18 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
36 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
37 六月 12, 2018 9:06:18 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
38 INFO: HHH000228: Running hbm2ddl schema update
39 1
40 Hibernate: 
41     insert 
42     into
43         t_teacher
44         (name) 
45     values
46         (?)
47 Hibernate: 
48     insert 
49     into
50         t_teacher
51         (name) 
52     values
53         (?)
54 Hibernate: 
55     insert 
56     into
57         t_student
58         (name, teacher) 
59     values
60         (?, ?)
61 Hibernate: 
62     insert 
63     into
64         t_student
65         (name, teacher) 
66     values
67         (?, ?)
68 六月 12, 2018 9:06:18 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
69 INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/zhangpn?serverTimezone=GMT&useSSL=false]
控制台日志
Hibernate: 
    insert 
    into
        t_teacher
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_teacher
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        t_student
        (name, teacher) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        t_student
        (name, teacher) 
    values
        (?, ?)

执行了4条插入语句


如果我们先保存学生,再保存老师呢?

 java

 

 控制台日志信息:

Hibernate: 
    insert 
    into
        t_student
        (name, teacher) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        t_student
        (name, teacher) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        t_teacher
        (name) 
    values
        (?)
Hibernate: 
    update
        t_student 
    set
        teacher=? 
    where
        id=?
Hibernate: 
    update
        t_student 
    set
        teacher=? 
    where
        id=?

 最后是更新了学生的外键属性;很容易理解:先保存的学生,老师没有信息;当老师信息存在了,在把信息更新到学生表里。

posted @ 2018-06-12 09:10  呦,可以呦  阅读(206)  评论(0编辑  收藏  举报