hibernate之6.one2many单向
来源:互联网 发布:帝国cms ajax提交表单 编辑:程序博客网 时间:2024/05/16 17:49
表结构:
实体类图:
CRUD:
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;}@Overridepublic 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;}}
配置:<?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"><key column="student_id"></key><one-to-many class="com.demo.model.Certificate"/></set></class></hibernate-mapping>
说明:
<set name="certificates">
<key column="student_id"></key>
<one-to-many class="com.demo.model.Certificate"/>
</set>
name:Student类的certificates属性名
<key column="student_id"></key> :关联字段名称
<one-to-many class="com.demo.model.Certificate"/> : Set元素的类全名
add:
@Testpublic void addTest() {Certificate certificate1 = new Certificate();certificate1.setCertificateName("aa");certificate1.setCertificateNo("3a10001");Certificate certificate2 = new Certificate();certificate2.setCertificateName("bb");certificate2.setCertificateNo("3a10002");Set<Certificate> set=new HashSet<Certificate>();set.add(certificate1);set.add(certificate2);Student student = new Student();student.setStudentName("钱六");student.setAge(35);student.setCertificates(set);Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();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, certificate_id) values (?, ?, ?)Hibernate: insert into t_certificate (certificate_name, certificate_no, certificate_id) values (?, ?, ?)Hibernate: update t_certificate set student_id=? where certificate_id=?Hibernate: update t_certificate set student_id=? where certificate_id=?从两条update语句中,我们发现此时的关联字段由one(Student)的一方来维护,这个明显不合适
loadTest:
@Testpublic void loadTest() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Student student =(Student) session.load(Student.class, 23);System.out.println("姓名:"+student.getStudentName());System.out.println("数量:"+student.getCertificates().size());session.getTransaction().commit();} catch (Exception e) {session.getTransaction().rollback();e.printStackTrace();} finally {HibernateUtil.closeSession(session);}}
loadLazyExtra:发出的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_ from t_certificate certificat0_ where certificat0_.student_id=?数量:2在set标签中添加属性:lazy="extra"
<?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>
运行代码:@Testpublic void loadLazyExtraTest() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Student student =(Student) session.load(Student.class, 23);System.out.println("姓名:"+student.getStudentName());System.out.println("数量:"+student.getCertificates().size());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 count(certificate_id) from t_certificate where student_id =?数量:2loadAssociatesTest:
@Testpublic void loadAssociatesTest() {Session session = null;try {session = HibernateUtil.openSession();session.beginTransaction();Student student =(Student) session.load(Student.class, 23);System.out.println("姓名:"+student.getStudentName());for(Certificate c:student.getCertificates()){System.out.println("编号:"+c.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_ from t_certificate certificat0_ where certificat0_.student_id=?编号:3a10001编号:3a10002
第二条查询语句用于查询关联对象,其实我们可以通过一条sql语句查询关联对象,如下:
select * from t_student t1inner join t_certificate t2 on t2.student_id=t1.student_idwhere t1.student_id=23;
后面再进行优化
0 0
- hibernate之6.one2many单向
- Hibernate中的one2many 单向关联
- Hibernate 映射关系 ---One2Many单向关联
- hibernate之7.one2many双向
- one2many单向关联
- Hibernate4映射之二: one2many单向映射(注解方式)
- Hibernate4映射之二: one2many单向映射(xml方式)
- Hibernate one2many 双向关联
- Hibernate One2Many映射关系
- hibernate 笔记(二)-----one2many
- hibernate之5.many2one单向
- hibernate之 8.one2one单向
- hibernate之 10.many2many单向
- Hibernate 的关系映射3 One2Many
- hibernate one2many 和many2many中的set
- Hibernate 映射关系 ---One2Many 双向关联
- hibernate One2Many级联增删改查
- Hibernate初学之一对一双向、单向
- 文法也可以通俗易懂
- hdu1027(n个数的按字典序排列的第m个序列)
- 【Android简易动画】计时小球(TimeBall)随时间变化不断跳动的小球
- 二叉查找树与红黑树原理和程序全面介绍
- 别让双手毁了青春!一段关于性成长经历的回忆。。。。。。
- hibernate之6.one2many单向
- YII 访问控制过了filters
- UDP通信编程------利用CAsyncSock类实现UDP异步通信
- Java Thread学习
- childNodes和nodeType
- Android中Adapter之BaseAdapter使用
- 计算机如何准备面试
- poj 1014 多重背包问题
- 第六周总结