Hibernate中多对一详解
两个类:(1)学生:Student(2)老师:Teacher
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
对应两个映射配置文件:(1)学生:Student.hbm.xml(2)老师:Teacher.hbm.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
一个配置文件:hibernate.cfg.xml
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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&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>
测试运行:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
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();
当我们先做保存老师再做保存学生时:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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语句;
我们再看一下,如果先保存学生,再保存老师时,会怎么样?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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语句!
因此,在项目开发中,先保存多对一中“一”的表会有更高的执行效率。
凝一眸碧水,拈一缕清风,于一怀静谧中倾听凡尘的落音。
不再奢求什么,做简单的自己,过简单的生活,心在,梦在,你在,便是光阴赐予我的最美。