20160507-hibernate入门

关联映射
多对一(Employee - Department)
一对多(Department-Employee)
一对一(Person - IDCard)
多对多(teacher - student)
组件映射(User-Name)
集合映射(set, list, map, bag)
inverse和cascade(Employee – Department)
 
多对一(Employee - Department)
映射文件<many-to-one name=”depart” column=”depart_id”/>
ER图
 
举例:
Department.java
 
package com.dzq.domain;

import java.io.Serializable;
import java.util.Set;

public class Department implements Serializable{
    private int id;
    private String name;
    private Set<Employee> empls;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<Employee> getEmpls() {
        return empls;
    }

    public void setEmpls(Set<Employee> empls) {
        this.empls = empls;
    }

    
    
}

 


Employee.java

package com.dzq.domain;

import java.io.Serializable;

public class Employee implements Serializable{
    private int id;
    private String name;
    private Department depart;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Department getDepart() {
        return depart;
    }

    public void setDepart(Department depart) {
        this.depart = depart;
    }

}

 


Department.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 package="com.dzq.domain">

    <class name="Department" table="department">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
    </class>

</hibernate-mapping>

 

  


Employee.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 package="com.dzq.domain">

    <class name="Employee" table="employee">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
        <many-to-one name="depart" column="depart_id" />
    </class>

</hibernate-mapping>

 

  测试代码:

public static void addEmAndDe(){
        Employee em=new Employee();
        Department depart=new Department();
        depart.setName("FBI");
        em.setDepart(depart);
        em.setName("AK47");
        HibernateUntils.add(depart);
        HibernateUntils.add(em);
    }

 

  

一对多(Department-Employee)
<set name=”employees”>
<key column=”depart_id”/>
<one-to-many class=”Employee”/>
</set>

 

  

一对一(Person - IdCard)
1)基于主键的one-to-one(person的映射文件)
<id name=”id”>
    <generator class=”foreign”><param name=”property”>idCard</param></generator>
<id>
<one-to-one name=”idCard” constrained=”true”/>

例子:

Person.java  主对象

package com.dzq.domain;

import java.io.Serializable;

public class Person  implements Serializable{
    private int id;
    private String name;
    private IDCard idcard;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public IDCard getIdcard() {
        return idcard;
    }

    public void setIdcard(IDCard idcard) {
        this.idcard = idcard;
    }

}

IDCard.java 从对象

package com.dzq.domain;

import java.io.Serializable;

public class IDCard  implements Serializable{
    private int id;
    private String name;
    private Person person;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }

}

IDCard.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 package="com.dzq.domain">

    <class name="IDCard" table="id_card">
        <id name="id" column="id">
            <generator class="foreign">
                <param name="property">person</param>
            </generator>
        </id>
        <property name="name" column="name" />
        <one-to-one name="person" constrained="true"/>
    </class>
   
</hibernate-mapping>

Person.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 package="com.dzq.domain">

    <class name="Person" table="person">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
        <one-to-one name="idcard"/>
    </class>
   
</hibernate-mapping>

 

测试代码:

OneToOne.java

package com.dzq.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.dzq.domain.IDCard;
import com.dzq.domain.Person;
import com.dzq.utils.HibernateUntils;

public class OneToOne {
    public static void main(String[] args) {
     add();
     queryPerson(1);
     queryIDcard(1);
    }
    
    public static Person add(){
        Session s=null;
        Transaction ts=null;
        try {
            s=HibernateUntils.getSession();
            Person p=new Person();
            IDCard idcard=new IDCard();
            idcard.setName("0606");
            p.setName("ll");
            p.setIdcard(idcard);
            idcard.setPerson(p);
            ts=s.beginTransaction();
            s.save(p);
            s.save(idcard);
            ts.commit();
            return p;
        } catch (Exception e) {
            if(ts!=null)
            ts.rollback();
            throw new RuntimeException(e);
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }
    
    /**
     * 查询主对象,用连接表查询
     * @param id
     * @return
     */
    public static Person queryPerson(int id){
        Session s=null;
        try {
            s=HibernateUntils.getSession();
            Person p=(Person) s.get(Person.class, id);
            System.out.println(p.getIdcard().getName());
            return p;
        } finally{
            if(s!=null){
                s.close();
            }
        }
    }
    /**
     * 查询从对象,查询两次
     * @param id
     * @return
     */
    public static IDCard queryIDcard(int id){
        Session s=null;
        try {
            s=HibernateUntils.getSession();
            IDCard idc= (IDCard) s.get(IDCard.class, id);
            System.out.println(idc.getPerson().getName());
            return idc;
        } finally{
            if(s!=null){
                s.close();
            }
        }
    }
}

 

 

2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束
<one-to-one name=”idCard” property-ref=“person”/>
  <!-property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应 -->
<many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/>
 <!-唯一的多对一,其实就便成了一对一了-->

 

<?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 package="com.dzq.domain">

<class name="IDCard" table="id_card">
<id name="id" column="id">
<!-- <generator class="foreign">
<param name="property">person</param>
</generator> -->
<generator class="native"/>
</id>
<property name="name" column="name" />
<!-- <one-to-one name="person" constrained="true"/> -->
<many-to-one name="person" column="person_id" unique="true"/>
</class>

</hibernate-mapping>

 

 

<?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 package="com.dzq.domain">

<class name="Person" table="person">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="name" column="name" />
<!-- <one-to-one name="idcard"/> -->
<one-to-one name="idcard" property-ref="person"/>
</class>

</hibernate-mapping>

 

 

 

多对多(teacher - student)
在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型;Hibernate会为我们创建中间关联表,转换成两个一对多。
<set name="teacher" table="teacher_student">
<key column="teacher_id"/>
<many-to-many class="Student" column="student_id"/>
</set>
l
 
<?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 package="com.dzq.domain">

    <class name="Student" table="student">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
        <set name="teachers" table="teacher_student">
            <key column="student_id"/>
            <many-to-many class="Teacher" column="teacher_id"/>
        </set>
    </class>
   
</hibernate-mapping>

 

<?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 package="com.dzq.domain">

    <class name="Teacher" table="teacher">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
        <set name="students" table="teacher_student">
            <key column="teacher_id"/>
            <many-to-many class="Student" column="student_id"/>
        </set>
    </class>
   
</hibernate-mapping>
package com.dzq.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.dzq.domain.Student;
import com.dzq.domain.Teacher;
import com.dzq.utils.HibernateUntils;

public class ManyToMany {

    public static void main(String[] args) {
    add();
    query(1);
    }

    
    public static void add(){
        Session s=null;
        Transaction ts=null;
        try {
            Set<Teacher> tes=new HashSet<Teacher>();
            Set<Student> stus=new HashSet<Student>();
            s=HibernateUntils.getSession();
            Teacher t1=new Teacher();
            t1.setName("gao");
            Teacher t2=new Teacher();
            t2.setName("gaoji");
            tes.add(t1);
            tes.add(t2);
            Student s1=new Student();
            s1.setName("hu");
            Student s2=new Student();
            s2.setName("xiaohu");
            stus.add(s1);
            stus.add(s2);
            t1.setStudents(stus);
            t2.setStudents(stus);
            /*s1.setTeachers(tes);
            s2.setTeachers(tes);*/ // 会报错,插入重复,要一个就行
            ts=s.beginTransaction();
            s.save(t1);
            s.save(t2);
            s.save(s1);
            s.save(s2);
            ts.commit();
        } catch (Exception e) {
            if(ts!=null)
            ts.rollback();
            throw new RuntimeException(e);
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }
    /**
     * 多对多查询,效率很低,用的比较少,最好使用分页查询,数据量很小才会使用,数据大量是会存在很严重的性能问题
     * @param id
     */
    
    public static void query(int id){
        Session s=null;
        try {
            s=HibernateUntils.getSession();
            Teacher teacher=(Teacher) s.get(Teacher.class, id);
            System.out.println(teacher.getStudents().size());
        } finally{
            if(s!=null){
                s.close();
            }
        }
    }
    
    
}
组件映射(User-Name)
关联的属性是个复杂类型的持久化类,但不是实体即:数据库中没有表与该属性对应,但该类的属性要之久保存的。
<component name=”name” class=”com.test.hibernate.domain.Name”>
        <property name=”initial”/>
        <property name=”first”/>
        <property name=”last”/>
</component>
当组件的属性不能和表中的字段简单对应的时候可以选择实现:
org.hibernate.usertype. UserType或
org.hibernate.usertype. CompositeUserType
 
package com.dzq.domain;

public class Name {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

只会产生一张表

<?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 package="com.dzq.domain">

    <class name="User" table="user">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <!-- <property name="username" column="username" /> -->
        <component name="username">
            <property name="firstName" column="first_name"/>
             <property name="lastName" column="last_name"/>
        </component>
        <property name="password" column="password" />
        <property name="mobile" column="mobile" />
        <property name="regdate" column="regdate"/>
    </class>

</hibernate-mapping>

关联关系的级联操作

 

package com.dzq.test;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.dzq.domain.Department;
import com.dzq.domain.Employee;
import com.dzq.utils.HibernateUntils;

public class ManyToOne {
   
    public static void main(String[] args) {
        add();
    }
    public static void addEmAndDe(){
        Employee em=new Employee();
        Department depart=new Department();
        depart.setName("FBI");
        em.setDepart(depart);
        em.setName("AK47");
        HibernateUntils.add(depart);
        HibernateUntils.add(em);
    }
    
    public static void add(){
        Session s=null;
        Transaction ts=null;
        try {
            
            Department dep=new Department();
            dep.setName("FBI");
            Employee e1=new Employee();
            Employee e2=new Employee();
            e1.setName("hi");
            e1.setDepart(dep);
            e2.setName("hello");
            e2.setDepart(dep);
            Set<Employee> empls=new HashSet<Employee>();
            empls.add(e1);
            empls.add(e2);
            dep.setEmpls(empls);
            s=HibernateUntils.getSession();
            ts=s.beginTransaction();
            //s.save(e1);
            //s.save(e2);
            s.save(dep);
            ts.commit();
        } catch (Exception e) {
            ts.rollback();
            throw new RuntimeException(e);
        }finally{
            if(s!=null){
                s.close();
            }
        }
    }

    
}
<?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 package="com.dzq.domain">

    <class name="Department" table="department">
        <id name="id" column="id">
            <generator class="native" />
        </id>
        <property name="name" column="name" />
         <set name="empls" cascade="save-update">
            <key column="depart_id"/>
            <one-to-many class="Employee"/>
        </set>
        <!-- <list name="empls">
            <key column="depart_id"/>
            <list-index column="order_col"/>
            <one-to-many class="Employee"/>
        </list> -->
        
        <!-- <bag name="empls">
            <key column="depart_id"/>
            <one-to-many class="Employee"/>
        </bag>
         -->
         
    </class>
   
</hibernate-mapping>

 

 
posted @ 2016-05-09 09:44  破玉  阅读(205)  评论(0编辑  收藏  举报