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

 

原文地址:https://www.cnblogs.com/wuxinyiwu/p/7498150.html