• Hibernate小笔记


     

     Hibernate的API中有5个非常重要的接口

       Session、SessionFactory、Configuration、Transaction和Query,他们是Hibernate组成的核心。

      Session接口: Session负责执行被持久化对象的增、删、改、查操作,类似于JDBC的Connection和Statement,要注意的是:session是非线程安全的,一般来说,一个线程包含一个session对象。

      SessionFactory接口:用来产生Session的工厂类,它负责为Java程序创建Session。一个SessionFactory代表一个数据源,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。通常,一个项目只需要一个SessionFactory。

      Configuration接口:负责Hibernate配置工作,创建SessionFactory对象,在Hibernate启动过程中,Configuration类的实例首先定位在映射文件位置,读取配置,然后创建SessionFactory对象。

      Transaction接口:负责事务相关的操作,它代表的是Hibernate事务,本质上也是数据库事务。Transaction是可选的。

      Query接口:负责执行各种数据查询功能,它可以使用Hibernate特有的HQL语言和SQL语句两种方式。 

     

     

      Hibernate的关联关系 

         1.一对多关系:一个主人多个房子

        反转生成文件时基本自动生成,只需修改cascade属性

        House.hbm.xml的关键配置

     <many-to-one cascade="all" name="users"  class="com.etc.entity.Users" fetch="select">
                <column name="USER_ID" precision="4" scale="0" />
            </many-to-one>

           Users.hbm.xml的关键配置

     <set cascade="all" name="houses" inverse="true">
                <key>
                    <column name="USER_ID"  precision="4" scale="0" />
                </key>
                <one-to-many  class="com.etc.entity.House" />
            </set>

         

        2.多对多关系

        数据库 :两张多对多表:各自建好主键 

            建中间表: 两个字段是两表的主键 中间表的主键是两个表主键的联合,外键其中一张表的主键(Project的主键为外键)

                 由于只有一个Project的外键,故只有保存项目时员工自动保存,保存员工时项目不保存

        注意:文件反向生成后需要修改类文件的set  ,然后修改xml文件

        Project.hbm.xml的关键配置

    <class name="com.etc.entity.Project" table="PROJECT" schema="HOUSE">
            <id name="proId" type="java.lang.Integer">
                <column name="PRO_ID" precision="22" scale="0" />
                <generator class="increment" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" length="20" />
            </property>
            <property name="empId" type="java.lang.Integer">
                <column name="EMP_ID" precision="22" scale="0" />
            </property>
            <set name="emppros" cascade="all" table="EMPPRO"><!-- table是中间表的名称-->
                <key>
                    <column name="PRO_ID" precision="22" scale="0" not-null="true" /><!-- column是中间表的项目id -->
                </key>
                <many-to-many class="com.etc.entity.Emp" column="EMP_ID" /><!-- column是中间表的员工id -->
            </set>
        </class>

        Emp.hbm.xml的关键配置   改动较大,set自己添加

    <class name="com.etc.entity.Emp" table="EMP" schema="HOUSE">
            <id name="empId" type="java.lang.Integer">
                <column name="EMP_ID" precision="22" scale="0" />
                <generator class="increment" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" length="20" />
            </property>
            <property name="proId" type="java.lang.Integer">
                <column name="PRO_ID" precision="22" scale="0" />
            </property><!-- inverse只需配置一个  且必须设置在Emp端-->
            <set name="projectpros" table="EMPPRO" inverse="true"> 
                <key column="EMP_ID" /><!-- column是中间表的员工id -->
                <many-to-many class="com.etc.entity.Project" column="PRO_ID" /><!-- column是中间表的项目id -->
            </set>
        </class>

      Emp类

    package com.etc.entity;
    
    import java.math.BigDecimal;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * Emp entity. @author MyEclipse Persistence Tools
     */
    
    public class Emp implements java.io.Serializable {
    
        // Fields
    
        private int empId;
        private String name;
        private int proId;
        private Set projectpros = new HashSet(0);
        // Constructors
    
        /** default constructor */
        public Emp() {
        }
    
        /** full constructor */
        public Emp(String name, int proId) {
            this.name = name;
            this.proId = proId;
        }
    
        // Property accessors
    
        public int getEmpId() {
            return this.empId;
        }
    
        public void setEmpId(int empId) {
            this.empId = empId;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getProId() {
            return this.proId;
        }
    
        public void setProId(int proId) {
            this.proId = proId;
        }
    
        public Set getProjectpros() {
            return projectpros;
        }
    
        public void setProjectpros(Set projectpros) {
            this.projectpros = projectpros;
        }
    
    }
    View Code

     Project类  

    package com.etc.entity;
    
    import java.math.BigDecimal;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * Project entity. @author MyEclipse Persistence Tools
     */
    
    public class Project implements java.io.Serializable {
    
        // Fields
    
        private int proId;
        private String name;
        private int empId;
        private Set emppros = new HashSet(0);
    
        // Constructors
    
        /** default constructor */
        public Project() {
        }
    
        /** full constructor */
        public Project(String name, int empId, Set emppros) {
            this.name = name;
            this.empId = empId;
            this.emppros = emppros;
        }
    
        // Property accessors
    
        public Integer getProId() {
            return this.proId;
        }
    
        public void setProId(int proId) {
            this.proId = proId;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getEmpId() {
            return this.empId;
        }
    
        public void setEmpId(int empId) {
            this.empId = empId;
        }
    
        public Set getEmppros() {
            return this.emppros;
        }
    
        public void setEmppros(Set emppros) {
            this.emppros = emppros;
        }
    
    }
    View Code

     测试代码:

    package com.etc.web;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.Test;
    
    import com.etc.entity.Emp;
    import com.etc.entity.Project;
    import com.etc.util.HibernateUtil;
    
    public class test {
        @Test
    //员工和项目都能添加
        public void  mutilTest(){
            Session session=HibernateUtil.currentSession();
            Transaction tx=session.beginTransaction();
            //创建2个项目,2个员工
            Project pro1=new Project();
            //pro1.setProId(new Integer(101));
            pro1.setName("乐鲜生活");
            
            Project pro2=new Project();
            //pro2.setProId(new Integer(101));
            pro2.setName("王者荣耀");
            
            Emp em1=new Emp();
           // em1.setEmpId(10);
            em1.setName("李子");
            Emp em2=new Emp();
           // em2.setEmpId(11);
            em2.setName("王五");
            
            //项目1由2名员工参加
            pro1.getEmppros().add(em1);
            pro1.getEmppros().add(em2);
            
            em1.getProjectpros().add(pro1);
            em1.getProjectpros().add(pro1);
            
            //项目2由员工2参加
            pro2.getEmppros().add(em2);
            em2.getProjectpros().add(pro2);
            
            try {
                session.save(pro1);
                session.save(pro2);
                tx.commit();
            } catch (Exception e) {
                 e.printStackTrace();
                 tx.rollback();
            }
            
            
            
            
        }
    //只添加员工
        @Test
        public void  mutilTest2(){
            Session session=HibernateUtil.currentSession();
            Transaction tx=session.beginTransaction();
            //创建2个项目,2个员工
            Project pro1=new Project();
            //pro1.setProId(new Integer(101));
            pro1.setName("乐鲜生活1");
            
            Project pro2=new Project();
            //pro2.setProId(new Integer(101));
            pro2.setName("王者荣耀1");
            
            Emp em1=new Emp();
           // em1.setEmpId(10);
            em1.setName("李子1");
            Emp em2=new Emp();
           // em2.setEmpId(11);
            em2.setName("王五1");
            
            //项目1由2名员工参加
            pro1.getEmppros().add(em1);
            pro1.getEmppros().add(em2);
            
            em1.getProjectpros().add(pro1);
            em1.getProjectpros().add(pro1);
            
            //项目2由员工2参加
            pro2.getEmppros().add(em2);
            em2.getProjectpros().add(pro2);
            
            try {
                session.save(em1);
                session.save(em2);
                tx.commit();
            } catch (Exception e) {
                 e.printStackTrace();
                 tx.rollback();
            }
            
        }
            
            
      
    }
    View Code


      3.set中的配置

      1.如果要建立类和类之间的关系,首先维护表之间的关系 
          多对一单向关联:配置的多的那一方 比如部门和员工,应该配置的员工
          一对多双向关联:员工中有dept对象,映射文件中配置<many-to-one>                 
                    部门中有empsset集合,映射文件中配置  <set name="emps">  <one-to-many>  </set>
      cascade:  配置在set标签上:默认是none:  当操作当前对象的时候,和其他对象不关联
      save-update 如果保存或者更新当前对象,其关联的对象也会保存和更新
      delete  如果删除当前对象,其关联的对象也会删除
      allsave-updatedelete

     

  • 相关阅读:
    问题 A: C#抽象类Vehicles
    最短路练习
    BFS
    poj 1083 Moving Tables
    组合数
    hdu 1443 Joseph【约瑟夫环】
    poj 2449 Remmarguts' Date【第K短路】
    hdu 1695 GCD 【莫比乌斯函数】
    hdu 2178 猜数字
    bzoj 2440 完全平方数 【莫比乌斯函数】
  • 原文地址:https://www.cnblogs.com/wuxinyiwu/p/7498150.html
Copyright © 2020-2023  润新知