hibernate之7.one2many双向
表结构
实体类关系
实体类源代码
Student
- package com.demo.model;
- import java.io.UnsupportedEncodingException;
- import java.util.Set;
- /**学生信息
- * @author wobendiankun
- *2014-10-19 下午08:54:29
- */
- public class Student {
- private int studentId ;
- private String studentName ;
- private int age;
- private Set<Certificate> certificates ;
- public int getStudentId() {
- return studentId;
- }
- public void setStudentId(int studentId) {
- this.studentId = studentId;
- }
- public String getStudentName() {
- return studentName;
- }
- public void setStudentName(String studentName) {
- this.studentName = studentName;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- @Override
- public String toString() {
- String str="";
- if(studentName!=null){
- try {
- str=new String(studentName.getBytes("UTF-8"));
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- }
- return "Student [studentId=" + studentId + ", studentName="
- + str + ", age=" + age + "]";
- }
- public Set<Certificate> getCertificates() {
- return certificates;
- }
- public void setCertificates(Set<Certificate> certificates) {
- this.certificates = certificates;
- }
- }
Certificate
- package com.demo.model;
- /**从业资格证书
- * @author wobendiankun
- *2014-10-25 上午11:43:21
- */
- public class Certificate {
- /**
- * 证书id
- */
- private int certificateId ;
- /**
- * 证书名称
- */
- private String certificateName;
- /**
- *证书编号
- */
- private String certificateNo ;
- private Student student ;
- public int getCertificateId() {
- return certificateId;
- }
- public void setCertificateId(int certificateId) {
- this.certificateId = certificateId;
- }
- public String getCertificateName() {
- return certificateName;
- }
- public void setCertificateName(String certificateName) {
- this.certificateName = certificateName;
- }
- public String getCertificateNo() {
- return certificateNo;
- }
- public void setCertificateNo(String certificateNo) {
- this.certificateNo = certificateNo;
- }
- public Student getStudent() {
- return student;
- }
- public void setStudent(Student student) {
- this.student = student;
- }
- }
xml配置:
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="com.demo.model.Student" table="t_student">
- <id name="studentId" column="student_id">
- <generator class="sequence">
- <param name="sequence">SEQ_T_STUDENT</param>
- </generator>
- </id>
- <property name="studentName" column="student_name" />
- <property name="age" />
- <set name="certificates" lazy="extra"><!-- lazy="extra" -->
- <key column="student_id"></key>
- <one-to-many class="com.demo.model.Certificate"/>
- </set>
- </class>
- </hibernate-mapping>
Certificate.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="com.demo.model.Certificate" table="t_certificate">
- <id name="certificateId" column="certificate_id">
- <generator class="sequence"><param name="sequence">SEQ_T_CERTIFICATE</param></generator>
- </id>
- <property name="certificateName" column="certificate_name"/>
- <property name="certificateNo" column="certificate_no"/>
- <many-to-one name="student" column="student_id"></many-to-one>
- </class>
- </hibernate-mapping>
CRUD:
add:
- @Test
- public void addTest(){
- Set<Certificate> certificates=new HashSet<Certificate>();
- Student student = new Student();
- student.setStudentName("王五");
- student.setAge(35);
- Certificate certificate1 = new Certificate();
- certificate1.setCertificateName("aa");
- certificate1.setCertificateNo("3a10001");
- certificate1.setStudent(student);
- Certificate certificate2 = new Certificate();
- certificate2.setCertificateName("bb");
- certificate2.setCertificateNo("3a10002");
- certificate2.setStudent(student);
- Session session = null;
- try {
- session = HibernateUtil.openSession();
- session.beginTransaction();
- // 先保存one,再保存many
- session.save(student);
- session.save(certificate1);
- session.save(certificate2);
- session.getTransaction().commit();
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- } finally {
- HibernateUtil.closeSession(session);
- }
- }
发出的SQL:
- Hibernate: insert into t_student (student_name, age, student_id) values (?, ?, ?)
- Hibernate: insert into t_certificate (certificate_name, certificate_no, student_id, certificate_id) values (?, ?
- , ?
- , ?)
- Hibernate: insert into t_certificate (certificate_name, certificate_no, student_id, certificate_id) values (?
- , ?
- , ?, ?)
update:
- @Test
- public void updateStudentTest(){
- Student student=new Student();
- student.setStudentId(63);
- student.setStudentName("李九");
- Session session = null;
- try {
- session = HibernateUtil.openSession();
- session.beginTransaction();
- session.update(student);
- session.getTransaction().commit();
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- } finally {
- HibernateUtil.closeSession(session);
- }
- }
发出的SQL:
- Hibernate: update t_student set student_name=?, age=? where student_id=?
- Hibernate: update t_certificate set student_id=null where student_id=?
因为Student为one的一方,默认发维护关联字段。会多发送一条更新语句,解决方案为加入配置 inverse="true" (Student.hbm.xml的set元素中,加入属性),
inverse="true" 代表由:many的一方来维护关联字段
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="com.demo.model.Student" table="t_student">
- <id name="studentId" column="student_id">
- <generator class="sequence">
- <param name="sequence">SEQ_T_STUDENT</param>
- </generator>
- </id>
- <property name="studentName" column="student_name" />
- <property name="age" />
- <set name="certificates" lazy="extra" inverse="true">
- <key column="student_id"></key>
- <one-to-many class="com.demo.model.Certificate"/>
- </set>
- </class>
- </hibernate-mapping>
updateInverse
- @Test
- public void updateStudentWithInverseTest(){
- Student student=new Student();
- student.setStudentId(63);
- student.setStudentName("李九");
- Session session = null;
- try {
- session = HibernateUtil.openSession();
- session.beginTransaction();
- session.update(student);
- session.getTransaction().commit();
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- } finally {
- HibernateUtil.closeSession(session);
- }
- }
发出的SQL:
- Hibernate: update t_student set student_name=?, age=? where student_id=?
维护关联字段的update语句不出现了
loadCertificate:
- @Test
- public void loadCertificateTest(){
- Session session = null;
- try {
- session = HibernateUtil.openSession();
- session.beginTransaction();
- Certificate certificate=(Certificate)session.load(Certificate.class, 65);
- Certificate certificate2=(Certificate)session.load(Certificate.class, 66);
- System.out.println("编号:"+certificate.getCertificateNo());
- System.out.println("姓名:"+certificate.getStudent().getStudentName());
- System.out.println("---------------------------");
- System.out.println("编号:"+certificate2.getCertificateNo());
- System.out.println("姓名:"+certificate2.getStudent().getStudentName());
- session.getTransaction().commit();
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- } finally {
- HibernateUtil.closeSession(session);
- }
- }
发出的SQL:
- Hibernate: select certificat0_.certificate_id as certific1_1_0_, certificat0_.certificate_name as certific2_1_0_, certificat0_.certificate_no as certific3_1_0_, certificat0_.student_id as student4_1_0_ from t_certificate certificat0_ where certificat0_.certificate_id=?
- 编号:3a10001
- Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?
- 姓名:李九
- ---------------------------
- Hibernate: select certificat0_.certificate_id as certific1_1_0_, certificat0_.certificate_name as certific2_1_0_, certificat0_.certificate_no as certific3_1_0_, certificat0_.student_id as student4_1_0_ from t_certificate certificat0_ where certificat0_.certificate_id=?
- 编号:3a10002
- 姓名:李九
共三条查询语句,查询id为66的记录时,因为id为63的Student对象已经变化在session中,所以不会再发出查询id为63的语句
loadStudent:
- @Test
- public void loadStudentTest(){
- Session session = null;
- try {
- session = HibernateUtil.openSession();
- session.beginTransaction();
- Student student=(Student)session.load(Student.class, 63);
- System.out.println("姓名:"+student.getStudentName());
- for(Certificate c:student.getCertificates()){
- System.out.println("\t编号:"+c.getCertificateNo());
- }
- System.out.println("-------------------");
- Certificate c1=(Certificate)session.get(Certificate.class, 65);
- System.out.println("编号:"+c1.getCertificateNo());
- session.getTransaction().commit();
- } catch (Exception e) {
- session.getTransaction().rollback();
- e.printStackTrace();
- } finally {
- HibernateUtil.closeSession(session);
- }
- }
发出的SQL
- Hibernate: select student0_.student_id as student1_0_0_, student0_.student_name as student2_0_0_, student0_.age as age0_0_ from t_student student0_ where student0_.student_id=?
- 姓名:李九
- Hibernate: select certificat0_.student_id as student4_0_1_, certificat0_.certificate_id as certific1_1_, certificat0_.certificate_id as certific1_1_0_, certificat0_.certificate_name as certific2_1_0_, certificat0_.certificate_no as certific3_1_0_, certificat0_.student_id as student4_1_0_ from t_certificate certificat0_ where certificat0_.student_id=?
- 编号:3a10001
- 编号:3a10002
- -------------------
- 编号:3a10001
id为65的Certificate对象,已经存在session中,所以session.get(Certificate.class, 65);不会发送查询语句
hibernate之7.one2many双向的更多相关文章
- hibernate一对一外键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- hibernate一对一主键双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Hibernate的关联映射——双向1-N关联
Hibernate的关联映射--双向1-N关联 对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系.双线的1-N关联和N-1关联是两种相同 ...
- hibernate(十)双向关联关系的CRUD
本文链接:http://www.orlion.ml/28/ 一.保存 1. 假设一个group有多个user,一个user只属于一个group,当保存user对象到数据库中时可以 User u = n ...
- Hibernate映射多对多双向关联关系(小案例)
多对多双向关联关系(Project(工程)/Emp(员工)为案例): 步骤如下: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project { //编号 pr ...
- [原创]java WEB学习笔记83:Hibernate学习之路---双向 1-n介绍,关键点解释,代码实现,set属性介绍(inverse,cascade ,order-by )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Hibernate 一对多自身双向关联关系 用于类别表的实现
分类:一对多自身双向关联关系 Java持久化类: package com.hyy.hibernate.one_to_many.domain; import java.util.HashSet; imp ...
- hibernate它 11.many2many双向
表结构: 类图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd29iZW5kaWFua3Vu/font/5a6L5L2T/fontsize/400/fi ...
- Hibernate 建立一对多双向关联关系
下面内容整理自<精通Hibernate>第二版 注:既然是双向关联."一对多双向关联"和"多对一双向关联"是同一回事. 对象位于内存中,在内存中从一 ...
随机推荐
- 当Shell遇上了Node.js(转载)
转载:http://developer.51cto.com/art/201202/315066.htm 好吧,我承认,这个标题有点暧昧的基情,但是希望下文的内部能给不熟悉或不喜欢Shell或WIN平台 ...
- layui日期输入框
<div class="layui-form-item"> <label class="layui-form-label& ...
- Spark2.2,IDEA,Maven开发环境搭建附测试
前言: 停滞了一段时间,现在要沉下心来学习点东西,出点货了. 本文没有JavaJDK ScalaSDK和 IDEA的安装过程,网络上会有很多文章介绍这个内容,因此这里就不再赘述. 一.在IDEA上安装 ...
- ACM_螺旋填数
螺旋填数 Time Limit: 2000/1000ms (Java/Others) Problem Description: 一天,小明在研究蜗牛的壳时,对其螺旋状的花纹感到十分有趣.于是他回到了家 ...
- xml之基本操作
XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Lang ...
- wcf 错误:无法加载或初始化请求的服务提供程序
解决办法:cmd netsh winsock reset 恢复网络编程接口
- Spring + Redis ( 简单使用)
1.Redis 的 Java API Java 中 使用 Redis 工具,要先去 maven 仓库中,下载 jedis jar包 jedis 依赖 <dependency> <gr ...
- windows phone控件
常用控件: 包括: Button控件.CheckBox控件.HyperlinkButton控件.Iamege控件.ListBox控件.PasswordBox控件.ProgressBar控件.Radio ...
- 【SQL】含有NULL值的排序
查询结果中有NULL值,当进行升序排序时,NULL值默认为“最大值”,排在最后面.要想改变NULL值的显示顺序,只需要在SQL语句后面加上NULLS FIRST(排在前面),NULLS LAST(排在 ...
- php知识点(基本上文档都有,只为方便记忆)
类型转换 (unset)转换为NULL (binary) 转换和 b 前缀转换支持为 PHP 5.2.1 新增 转换二进制 隐藏php后缀名 AddType application/x-httpd ...