zoukankan      html  css  js  c++  java
  • 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;

    后面再进行优化


  • 相关阅读:
    cmanformat
    mysql-sql语言参考
    jQuery 判断多个 input checkbox 中至少有一个勾选
    Java实现 蓝桥杯 算法提高 计算行列式
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 数独游戏
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
    Java实现 蓝桥杯 算法提高 成绩排序2
  • 原文地址:https://www.cnblogs.com/llguanli/p/8662503.html
Copyright © 2011-2022 走看看