• 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>
     
  • 相关阅读:
    Eclipse设置智能提示
    【GoLang】golang 如何像Java 一样通过类名反射对象?
    【GoLang】golang 面向对象编程 & 面向接口编程
    【Nginx】nginx 代理 Haproxy 怎么设置?
    【GoLang】GoLang struct 使用
    【GoLang】50 个 Go 开发者常犯的错误
    【GoLang】与或非 异或操作
    【GoLang】GoLang UTF8 与 Unicode
    【GoLang】GoLang 错误处理 -- 异常处理思路示例
    【GoLang】GoLang 的流程与函数
  • 原文地址:https://www.cnblogs.com/xiaoduc-org/p/5467938.html
Copyright © 2020-2023  润新知