在《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 }
从代码中,看出,我们先保存的老师,后保存的学生;
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=?
最后是更新了学生的外键属性;很容易理解:先保存的学生,老师没有信息;当老师信息存在了,在把信息更新到学生表里。