java鬼混笔记:Hibernate:5、一对多关联(单向,双向)
来源:互联网 发布:什么软件看电子书免费 编辑:程序博客网 时间:2024/06/05 06:03
这次的笔记是hibernate 的一对多 关系,常见的如一个班级多个学生,和多对一是相反的角度来讲的,不过代码还是有些差别,上代码了。
一对多单向:
Classroom.java
package com.ywj.TestHibernate.e;import java.io.Serializable;import java.util.Set;public class Classroom implements Serializable {/** * */private static final long serialVersionUID = 5730317497296467931L;private Long id;private String name;private Set<Student> student;// 多个学生public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Student> getStudent() {return student;}public void setStudent(Set<Student> student) {this.student = student;}}
Classroom.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ywj.TestHibernate.e"><class name="Classroom" table="classroom"><!-- 生成对象唯一的OID标示符 --><id name="id" column="id" type="java.lang.Long"><generator class="identity" /></id><!-- 普通写法 --><property name="name" /><!-- 一对多的写法 --><set name="student" ><!-- inverse="true" --><key column="classroom"></key><!-- 这个column会在student表中生成 --><one-to-many class="Student"/></set></class></hibernate-mapping>
Student.java
package com.ywj.TestHibernate.e;import java.io.Serializable;public class Student implements Serializable {private static final long serialVersionUID = 9053757358736102041L;private Long id;private String name;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ywj.TestHibernate.e"><class name="Student" table="student"><!-- 生成对象唯一的标示符 --><id name="id" column="id" type="java.lang.Long"><generator class="identity" /></id><!-- 普通写法 --><property name="name" /></class></hibernate-mapping>
Test.java
package com.ywj.TestHibernate.test;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import com.ywj.TestHibernate.e.Classroom;import com.ywj.TestHibernate.e.Student;public class Test {public static void main(String[] args) {Session s = HibernateUtils.getCurrentSession();Transaction t = null;try {t = s.beginTransaction();// 添加Classroom classroom = new Classroom();classroom.setName("classroom");Student st1 = new Student();st1.setName("stu1");Student st2 = new Student();st2.setName("stu2");Set<Student> set = new HashSet<Student>();set.add(st2);set.add(st1);classroom.setStudent(set);s.save(classroom);s.save(st1);s.save(st2);// 多出2条update sql,这多出的sql主要是更新student表 让student的classroom补上相关的值// 双向关联可以避免这个多出update sql问题t.commit();// 查询Classroom cls = (Classroom) s.load(Classroom.class, 1L);System.out.println(cls.getStudent().size());} catch (Exception e) {e.printStackTrace();t.rollback();} finally {s.close();}}}
Classroom.java
package com.ywj.TestHibernate.e;import java.io.Serializable;import java.util.Set;public class Classroom implements Serializable {/** * */private static final long serialVersionUID = 5730317497296467931L;private Long id;private String name;private Set<Student> student;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Student> getStudent() {return student;}public void setStudent(Set<Student> student) {this.student = student;}}
Classroom.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ywj.TestHibernate.e"><class name="Classroom" table="classroom"><!-- 生成对象唯一的OID标示符 --><id name="id" column="id" type="java.lang.Long"><generator class="identity" /></id><!-- 普通写法 --><property name="name" /><!-- 一对多的写法 --><set name="student" inverse="true"><!-- inverse="true" 的作用是 classroom不用记住他的student是谁,也就是不用classroom来维护关系 ,由student来维护比如 学校校长不必记录我校的学生是谁,只要学生记住我这个校长是谁就行了 --><key column="classroom"></key><!-- 这个column要和student中的<many-to-one>中的column一样 --><one-to-many class="Student"/></set></class></hibernate-mapping>
Student.java
package com.ywj.TestHibernate.e;import java.io.Serializable;public class Student implements Serializable {private static final long serialVersionUID = 9053757358736102041L;private Long id;private String name;private Classroom classroom;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Classroom getClassroom() {return classroom;}public void setClassroom(Classroom classroom) {this.classroom = classroom;}}
Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.ywj.TestHibernate.e"><class name="Student" table="student"><!-- 生成对象唯一的标示符 --><id name="id" column="id" type="java.lang.Long"><generator class="identity" /></id><!-- 普通写法 --><property name="name" /><!-- 生成一个外键classroom,对应classroom表的id --><many-to-one name="classroom" column="classroom" class="Classroom"></many-to-one></class></hibernate-mapping>
Test.java
package com.ywj.TestHibernate.test;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import org.hibernate.Transaction;import com.ywj.TestHibernate.e.Classroom;import com.ywj.TestHibernate.e.Student;public class Test {public static void main(String[] args) {Session s = HibernateUtils.getCurrentSession();Transaction t = null;try {t = s.beginTransaction();// 添加Classroom classroom = new Classroom();classroom.setName("classroom");Student st1 = new Student();st1.setName("stu1");st1.setClassroom(classroom);Student st2 = new Student();st2.setName("stu2");st2.setClassroom(classroom);/*不用classroon来维护关系了,由student来维护关系就行了,在classroom.hbm.xml中配置了inverse="true"Set<Student> set = new HashSet<Student>();set.add(st2);set.add(st1);classroom.setStudent(set);*/s.save(classroom);s.save(st1);s.save(st2);// 这里没有多出update语句啦,因为不用classroom来维护关系啦t.commit();// 查询/*Classroom cls = (Classroom) s.load(Classroom.class, 1L);System.out.println(cls.getStudent().size());Student stu = (Student) s.load(Student.class, 1L);System.out.println(stu.getClassroom().getName());*/} catch (Exception e) {e.printStackTrace();t.rollback();} finally {s.close();}}}
OK.......
阅读全文
0 0
- java鬼混笔记:Hibernate:5、一对多关联(单向,双向)
- java鬼混笔记:Hibernate:2、一对一关系之主键单向和双向关联
- java鬼混笔记:Hibernate:3、一对一关系之外键单向和双向关联
- java鬼混笔记:Hibernate:5、多对多关联、多对多拆份两个一对多
- hibernate一对多单向、双向关联
- hibernate中----一对多单向关联,一对多双向关联
- Hibernate一对多双向关联,多对多单向关联
- Hibernate xml一对多关联映射 单向+双向
- Hibernate的一对多关联关系(单向和双向)
- Hibernate关联关系映射(单向一对多、单向多对一、双向一对多)
- Hibernate 单向多对一、单向一对多、双向一对多关联关系详解
- hibernate映射关系 一对多、多对一单向关联 一对多双向关联
- Hibernate中的延迟加载、实体关联单向一对多及双向一对多实体关联
- 关于hibernate的多对一单向关联,一对多单向关联,和一对多双向关联的疑惑解答
- 关于hibernate的多对一单向关联,一对多单向关联,和一对多双向关联的疑惑解答
- 关于hibernate的多对一单向关联,一对多单向关联,和一对多双向关联的疑惑解答
- Hibernate一对多单向关联
- hibernate一对多单向关联
- 为Android的apk应用程序文件加壳以防止反编译的教程
- JavaScript常见的排序算法(一)
- 捡金币
- 北京大学是否奇闻多?
- 浏览器F12小结
- java鬼混笔记:Hibernate:5、一对多关联(单向,双向)
- 和为S的两个数字
- ACPC Headquarters : AASTMT (Stairway to Heaven)
- setContentView源码解析(API25)
- 小易喜欢的序列
- rhel7 grub配置文件及排错root密码找回
- NAT模式下,虚机静态ip无法连网络的临时解决办法
- 3450: Tyvj1952 Easy
- web容器