Hibernate中多对一详解

两个类:(1)学生:Student(2)老师:Teacher

 1 package easyStart.Entity;
 2 
 3 public class Student {
 4     private int id;
 5     private String name;
 6     private Teacher teacher;
 7 
 8     public int getId() {
 9         return id;
10     }
11 
12     public void setId(int id) {
13         this.id = id;
14     }
15 
16     public String getName() {
17         return name;
18     }
19 
20     public void setName(String name) {
21         this.name = name;
22     }
23 
24     public Teacher getTeacher() {
25         return teacher;
26     }
27 
28     public void setTeacher(Teacher teacher) {
29         this.teacher = teacher;
30     }
31 
32     public Student() {
33     }
34 
35     public Student(String name, Teacher teacher) {
36         this.name = name;
37         this.teacher = teacher;
38     }
39 
40 }
Student
 1 package easyStart.Entity;
 2 
 3 public class Teacher {
 4     private int id;
 5     private String name;
 6 
 7     public int getId() {
 8         return id;
 9     }
10 
11     public void setId(int id) {
12         this.id = id;
13     }
14 
15     public String getName() {
16         return name;
17     }
18 
19     public void setName(String name) {
20         this.name = name;
21     }
22 
23     public Teacher(String name) {
24         this.name = name;
25     }
26 
27     public Teacher() {
28     }
29 
30     @Override
31     public String toString() {
32         return "Teacher [id=" + id + ", name=" + name + "]";
33     }
34 
35 }
Teacher

对应两个映射配置文件:(1)学生:Student.hbm.xml(2)老师:Teacher.hbm.xml

 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.Student" table="t_student">
 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         <many-to-one name="teacher" class="easyStart.Entity.Teacher">
15             <column name="teacher" />
16         </many-to-one>
17     </class>
18 </hibernate-mapping>
Student.hbm.xml
 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     </class>
15 </hibernate-mapping>
Teacher.hbm.xml

一个配置文件:hibernate.cfg.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 3                                          "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 4 <hibernate-configuration>
 5     <session-factory>
 6         <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
 7         <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/zhangpn?serverTimezone=GMT&amp;useSSL=false</property>
 8         <property name="hibernate.connection.username">root</property>
 9         <property name="hibernate.connection.password">zhangpn</property>
10         <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
11         <property name="hibernate.show_sql">true</property>
12         <property name="hibernate.format_sql">true</property>
13         <property name="hibernate.hbm2ddl.auto">update</property>
14         <mapping resource="easyStart/Entity/Student.hbm.xml"/>
15         <mapping resource="easyStart/Entity/Teacher.hbm.xml"/>
16     </session-factory>
17 </hibernate-configuration>
hibernate.cfg.xml

测试运行:

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

当我们先做保存老师再做保存学生时:

 1 六月 12, 2018 8:11:05 上午 org.hibernate.Version logVersion
 2 INFO: HHH000412: Hibernate Core {5.0.1.Final}
 3 六月 12, 2018 8:11:05 上午 org.hibernate.cfg.Environment <clinit>
 4 INFO: HHH000206: hibernate.properties not found
 5 六月 12, 2018 8:11:05 上午 org.hibernate.cfg.Environment buildBytecodeProvider
 6 INFO: HHH000021: Bytecode provider name : javassist
 7 六月 12, 2018 8:11:05 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
 8 INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
 9 六月 12, 2018 8:11:06 上午 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 8:11:06 上午 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 8:11:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
14 WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
15 六月 12, 2018 8:11:07 上午 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 8:11:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
18 INFO: HHH000046: Connection properties: {user=root, password=****}
19 六月 12, 2018 8:11:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
20 INFO: HHH000006: Autocommit mode: false
21 六月 12, 2018 8:11:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
22 INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
23 六月 12, 2018 8:11:07 上午 org.hibernate.dialect.Dialect <init>
24 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
25 六月 12, 2018 8:11:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
26 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
27 六月 12, 2018 8:11:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
28 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
29 六月 12, 2018 8:11:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
30 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
31 六月 12, 2018 8:11:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
32 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
33 六月 12, 2018 8:11:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
34 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
35 六月 12, 2018 8:11:07 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
36 INFO: HHH000228: Running hbm2ddl schema update
37 1
38 Hibernate: 
39     insert 
40     into
41         t_teacher
42         (name) 
43     values
44         (?)
45 Hibernate: 
46     insert 
47     into
48         t_student
49         (name, teacher) 
50     values
51         (?, ?)
52 Hibernate: 
53     insert 
54     into
55         t_student
56         (name, teacher) 
57     values
58         (?, ?)
59 六月 12, 2018 8:11:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
60 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_student
        (name, teacher) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        t_student
        (name, teacher) 
    values
        (?, ?)

可以看出:数据正常插入,直接执行了3条insert语句;


我们再看一下,如果先保存学生,再保存老师时,会怎么样?

 1 package easyStart.Run;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.boot.MetadataSources;
 6 import org.hibernate.boot.registry.StandardServiceRegistry;
 7 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
 8 
 9 import easyStart.Entity.Student;
10 import easyStart.Entity.Teacher;
11 
12 public class QuickStart {
13 
14     public static void main(String[] args) {
15 
16         final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
17         SessionFactory sessionFactory = null;
18         try {
19             sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
20             System.out.println("1");
21         } catch (Exception e) {
22             System.out.println("2");
23             StandardServiceRegistryBuilder.destroy(registry);
24         }
25 
26         Session session = sessionFactory.openSession();
27         session.beginTransaction();
28         // 处理事务 Begin
29         Teacher teacher = new Teacher("ZhangXY");
30 //        session.save(teacher);
31         Student student1 = new Student("ZhangFang", teacher);
32         session.save(student1);
33         Student student2 = new Student("Zhangwen", teacher);
34         session.save(student2);
35         
36         session.save(teacher);
37         
38         
39         // 处理事务 End
40         session.getTransaction().commit();
41         session.close();
42         sessionFactory.close();
43     }
44 }
Java源码
 1 六月 12, 2018 8:15:05 上午 org.hibernate.Version logVersion
 2 INFO: HHH000412: Hibernate Core {5.0.1.Final}
 3 六月 12, 2018 8:15:05 上午 org.hibernate.cfg.Environment <clinit>
 4 INFO: HHH000206: hibernate.properties not found
 5 六月 12, 2018 8:15:05 上午 org.hibernate.cfg.Environment buildBytecodeProvider
 6 INFO: HHH000021: Bytecode provider name : javassist
 7 六月 12, 2018 8:15:06 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
 8 INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
 9 六月 12, 2018 8:15:06 上午 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 8:15:06 上午 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 8:15:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
14 WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
15 六月 12, 2018 8:15:07 上午 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 8:15:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
18 INFO: HHH000046: Connection properties: {user=root, password=****}
19 六月 12, 2018 8:15:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
20 INFO: HHH000006: Autocommit mode: false
21 六月 12, 2018 8:15:07 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
22 INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
23 六月 12, 2018 8:15:07 上午 org.hibernate.dialect.Dialect <init>
24 INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
25 六月 12, 2018 8:15:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
26 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
27 六月 12, 2018 8:15:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
28 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
29 六月 12, 2018 8:15:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
30 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
31 六月 12, 2018 8:15:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
32 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
33 六月 12, 2018 8:15:07 上午 org.hibernate.boot.model.source.internal.hbm.ModelBinder bindProperty
34 WARN: HHH90000003: Use of DOM4J entity-mode is considered deprecated
35 六月 12, 2018 8:15:08 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
36 INFO: HHH000228: Running hbm2ddl schema update
37 1
38 Hibernate: 
39     insert 
40     into
41         t_student
42         (name, teacher) 
43     values
44         (?, ?)
45 Hibernate: 
46     insert 
47     into
48         t_student
49         (name, teacher) 
50     values
51         (?, ?)
52 Hibernate: 
53     insert 
54     into
55         t_teacher
56         (name) 
57     values
58         (?)
59 Hibernate: 
60     update
61         t_student 
62     set
63         name=?,
64         teacher=? 
65     where
66         id=?
67 Hibernate: 
68     update
69         t_student 
70     set
71         name=?,
72         teacher=? 
73     where
74         id=?
75 六月 12, 2018 8:15:08 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
76 INFO: HHH000030: Cleaning up connection pool [jdbc:mysql://localhost:3306/zhangpn?serverTimezone=GMT&useSSL=false]
日志信息
        session.beginTransaction();
        // 处理事务 Begin
        Teacher teacher = new Teacher("ZhangXY");
//        session.save(teacher);
        Student student1 = new Student("ZhangFang", teacher);
        session.save(student1);
        Student student2 = new Student("Zhangwen", teacher);
        session.save(student2);
        
        session.save(teacher);
        
        // 处理事务 End
        session.getTransaction().commit();
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
        name=?,
        teacher=? 
    where
        id=?
Hibernate: 
    update
        t_student 
    set
        name=?,
        teacher=? 
    where
        id=?

可以看出,数据正常插入,但是相比先保存老师,多了两条update语句!


因此,在项目开发中,先保存多对一中“一”的表会有更高的执行效率。

 

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