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类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } }
Project类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } }
测试代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); } } }
3.set中的配置
1.如果要建立类和类之间的关系,首先维护表之间的关系