hibernate双向一对多关联映射XML与注解版
来源:互联网 发布:mac os x10.10iso镜像 编辑:程序博客网 时间:2024/06/05 05:32
双向一对多关联映射原理:
一对多双向关联映射,即在一的一端存在多的一端的一个集合对象,在多的一端存在一的一端的一个对象,这样就可以保证在加载一的一端或多的一端将被指向端的集合或对象加载上来,即保证双向关联。
只不过是角度不同,我们从Classes一端来看,它就是一对多,它维护了一个一指向多的关系。在加载班级时,能够把学生加载上来。返过来,多个学生是属于一个班级的,它就是多对一。
(1)XML版
SQL文件:
CREATE TABLE `student` ( `id` varchar(255) NOT NULL, `sname` varchar(255) DEFAULT NULL, `class_id` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE `classess` ( `id` varchar(255) NOT NULL, `cname` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Classess类:
package Hibernate_demo1.Demo13.Entity;import java.util.Set;public class Classess {private String id;private String cname;private Set<Student> students;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
Student类:
package Hibernate_demo1.Demo13.Entity;public class Student {private String id;private String sname;private Classess classes;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Classess getClasses() {return classes;}public void setClasses(Classess classes) {this.classes = classes;}}
Classess.hbm.xml映射文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Hibernate_demo1.Demo13.Entity.Classess" table="classess"> <id name="id" type="java.lang.String"> <column name="id"/> <generator class="uuid"> </generator> </id> <property name="cname" column="cname"/> <set name="students"> <key column="class_id"></key> <one-to-many class="Hibernate_demo1.Demo13.Entity.Student"></one-to-many> </set> </class> </hibernate-mapping>
Student.hbm.xml映射文件:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Hibernate_demo1.Demo13.Entity.Student" table="student"> <id name="id"> <generator class="uuid"> </generator> </id> <property name="sname" column="sname"/> <!-- 在多的一端Student中添加一行新的Classes列 ,并且列的名称要和Classes.hbm.xml的列明相同--> <many-to-one name="classes" column="class_id"></many-to-one> </class> </hibernate-mapping>
测试:
1、先写班级后写学生
先把班级写入到数据库中后,Classes对象进入了Transient状态,并在数据库中有了一行,这时再写Student对象,Student对象会查找对应的Classes的主键将其写入到表中,所以此时关系模型中的数据都是非空的,保存的代码如下:
package Hibernate_demo1.Demo13;import org.hibernate.Session;import Hibernate_demo1.Demo13.Entity.Classess;import Hibernate_demo1.Demo13.Entity.Student;import Hibernate_demo1.Demo13.Util.HibernateUtils;//在多的一端存储public class Test1 { public static void main( String[] args ) { Session session = null; try{ session = HibernateUtils.getSession(); session.beginTransaction(); //创建班级 Classess cla1=new Classess(); cla1.setCname("1班"); session.save(cla1); //创建学生 Student stu1=new Student(); stu1.setSname("小黑"); stu1.setClasses(cla1); session.save(stu1); Student stu2=new Student(); stu2.setSname("小明"); stu2.setClasses(cla1); session.save(stu2); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); } }}
执行结果:
Hibernate: insert into classess (cname, id) values (?, ?)Hibernate: insert into student (sname, class_id, id) values (?, ?, ?)Hibernate: insert into student (sname, class_id, id) values (?, ?, ?)
classess表:
student表:
2、先写学生后写班级
代码如下:
package Hibernate_demo1.Demo13;import java.util.HashSet;import java.util.Set;import org.hibernate.Session;import Hibernate_demo1.Demo13.Entity.Classess;import Hibernate_demo1.Demo13.Entity.Student;import Hibernate_demo1.Demo13.Util.HibernateUtils;public class Test2 {public static void main(String[] args) {Session session = null; try{ session = HibernateUtils.getSession(); session.beginTransaction(); //创建学生对象 Student stu1=new Student(); stu1.setSname("小黑"); session.save(stu1); Student stu2=new Student(); stu2.setSname("小明"); session.save(stu2); //创建学生集合 Set<Student> st=new HashSet(); st.add(stu1); st.add(stu2); //创建班级 Classess cla1=new Classess(); cla1.setCname("1班"); cla1.setStudents(st); //将学生集合写入到Classes中 session.save(cla1); session.getTransaction().commit(); }catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); }finally{ HibernateUtils.closeSession(session); }}}
执行结果如下:
Hibernate: insert into student (sname, class_id, id) values (?, ?, ?)Hibernate: insert into student (sname, class_id, id) values (?, ?, ?)Hibernate: insert into classess (cname, id) values (?, ?)Hibernate: update student set class_id=? where id=?Hibernate: update student set class_id=? where id=?
完整示例: http://download.csdn.net/detail/u011781521/9835744
(2)注解版
Classess类:
package Hibernate_demo1.Demo14.Entity;import java.util.HashSet;import java.util.Set;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name="classess")public class Classess {@Id @GenericGenerator(name="uuidGenerator", strategy="uuid") @GeneratedValue(generator="uuidGenerator")private String id;@Column(name="cname")private String cname;@JoinColumn(name="class_id") @OneToManyprivate Set<Student> students=new HashSet<Student>();public String getId() {return id;}public void setId(String id) {this.id = id;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public Set<Student> getStudents() {return students;}public void setStudents(Set<Student> students) {this.students = students;}}
Student类:
package Hibernate_demo1.Demo14.Entity;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.ManyToOne;import javax.persistence.Table;import org.hibernate.annotations.GenericGenerator;@Entity@Table(name="student")public class Student {@Id @GenericGenerator(name="uuidGenerator", strategy="uuid") @GeneratedValue(generator="uuidGenerator")private String id;@Column(name="sname")private String sname;@JoinColumn(name="class_id") @ManyToOneprivate Classess classes;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public Classess getClasses() {return classes;}public void setClasses(Classess classes) {this.classes = classes;}}
测试类:
package Hibernate_demo1.Demo14;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import Hibernate_demo1.Demo14.Entity.Classess;import Hibernate_demo1.Demo14.Entity.Student;public class App { public static void main( String[] args ) { SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); Transaction tx = session.beginTransaction(); //创建班级 Classess cla1=new Classess(); cla1.setCname("2班"); session.save(cla1); //创建学生 Student stu1=new Student(); stu1.setSname("小黑"); stu1.setClasses(cla1); session.save(stu1); Student stu2=new Student(); stu2.setSname("小明"); stu2.setClasses(cla1); session.save(stu2); tx.commit(); session.close(); }}
执行结果如下:
Hibernate: insert into classess (cname, id) values (?, ?)Hibernate: insert into student (class_id, sname, id) values (?, ?, ?)Hibernate: insert into student (class_id, sname, id) values (?, ?, ?)
示例代码: http://download.csdn.net/detail/u011781521/9835780
0 1
- hibernate双向一对多关联映射XML与注解版
- hibernate双向一对一主键关联映射XML与注解版
- hibernate单向一对多关联映射(one-to-many)XML与注解版
- Hibernate xml一对多关联映射 单向+双向
- hibernate双向多对多关联映射XML与注解版
- Hibernate一对多关联双向映射
- hibernate映射一对多双向关联关系
- Hibernate一对多双向关联映射
- Hibernate一对多双向关联映射
- hibernate注解方式双向一对多关联
- Hibernate一对多关联映射(注解)
- hibernate一对多关联映射(双向关联)(转)
- Hibernate 一对多关联映射(双向关联)
- Hibernate关联映射 --- 一对多实例分析(双向关联)
- hibernate映射总结详解: 映射一对多双向关联关系
- Hibernate 关联映射之---- 一对多双向映射
- hibernate 关联映射 双向多对一(一对多)
- 在测试Hibernate的一对多双向关联映射时
- Model2
- 欢迎使用CSDN-markdown编辑器
- 一个不一样的ajax
- idea 2017破解码
- MapStruct 代替BeanUtil 和ModelMapper
- hibernate双向一对多关联映射XML与注解版
- java4种线程池的基本使用
- [Algorithm]九章三:Binary Tree & Divide Conquer
- FEP: 测试 lineage, 获得 CPU, MEMORY 统计信息
- 线程池的submit和execute的区别
- C语言链表使用详解
- FEP: 测试 docker matrix, 获得 CPU, MEMORY, 网络性能的 统计信息
- Android 分组ListView+索引条
- 利用jsoup爬取网页信息