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);}}


发出的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


loadLazyExtra:

在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 =?数量:2


loadAssociatesTest:

@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