• hibernate之6.one2many单向


    表结构:



    实体类图:



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

    配置:

    <?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:

    @Test
    	public 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:

    @Test
    	public 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>


    执行代码:

    @Test
    	public 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:

    @Test
    	public 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 t1
    inner join   t_certificate t2 on t2.student_id=t1.student_id
    where t1.student_id=23;

    后面再进行优化


  • 相关阅读:
    freopen stdout 真的更快?
    【评分】第二次作业——个人项目实战
    【评分】第二次作业-数独-第一次测试成绩
    姑娘你大胆地往前走——答大二学生XCL之八问
    第二次作业-数独-初步测试日志
    第二次作业——个人项目实战
    关于C#的随机数
    必须展示窗口才能截图怎么办,伪后台截图思路
    Winform 奇怪的 英文字体错乱显示问题
    wpf 解决 WPF SelectionChanged事件向上传递造成重复执行不想执行的函数的问题
  • 原文地址:https://www.cnblogs.com/llguanli/p/8662503.html
Copyright © 2020-2023  润新知