首先是两个Bean持久化类,Department部门类(引用外键)与Manager部门经理类.
Department部门类
//部门
public class Department {
//部门ID
private Integer deptId;
//部门名
private String depyName;
//部门经理-外键
private Manager mgr;
public Department() {
super();
}
public Department(Integer deptId, String depyName, Manager mgr) {
super();
this.deptId = deptId;
this.depyName = depyName;
this.mgr = mgr;
}
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public String getDepyName() {
return depyName;
}
public void setDepyName(String depyName) {
this.depyName = depyName;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
Manager部门经理类
//部门经理类
public class Manager {
//ID
private Integer mgrId;
//名字
private String mgrName;
//关联的部门
private Department dept;
public Manager() {
super();
}
public Manager(Integer mgrId, String mgrName, Department dept) {
super();
this.mgrId = mgrId;
this.mgrName = mgrName;
this.dept = dept;
}
public Integer getMgrId() {
return mgrId;
}
public void setMgrId(Integer mgrId) {
this.mgrId = mgrId;
}
public String getMgrName() {
return mgrName;
}
public void setMgrName(String mgrName) {
this.mgrName = mgrName;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
}
下面是XML配置文件
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="entity3">
<class name="Department" table="department">
<!-- id:表中的主键,name:类中的属性名 -->
<id name="deptId" type="java.lang.Integer">
<!-- name:表中的序列名 -->
<column name="deptId"/>
<!-- 指定主键的生成方式,native:使用数据库本地的方式 -->
<generator class="native"/>
</id>
<!-- property一般字段 -->
<property name="depyName" type="java.lang.String">
<column name="depyName"/>
</property>
<!--
使用 many-to-one 映射1-1关系
unique="true" 添加外键唯一约束
-->
<many-to-one name="mgr" class="Manager" column="mgrId" unique="true" >
</many-to-one>
</class>
</hibernate-mapping>
Manager.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="entity3">
<class name="Manager" table="manager">
<!-- id:表中的主键,name:类中的属性名 -->
<id name="mgrId" type="java.lang.Integer">
<!-- name:表中的序列名 -->
<column name="mgrId"/>
<!-- 指定主键的生成方式,native:使用数据库本地的方式 -->
<generator class="native"/>
</id>
<!-- property一般字段 -->
<property name="mgrName" type="java.lang.String">
<column name="mgrName"/>
</property>
<!--
映射1-1的关联关系:在对应的数据表中已经有外键了,当前持久化类
使用one-to-one进行映射
-->
<!--
property-ref="mgr":指定使用被关联实体主键以外的字段作为关联字段
例:使用Department表(引用外键的表),
用Department的外键mgr与Manager的ID做关联
-->
<one-to-one name="dept" class="Department" property-ref="mgr">
</one-to-one>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="connection.username">root</property>
<property name="connection.password">1234</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<!-- 配置Hibernate的基本信息 -->
<!-- Hibernate所使用的数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 执行操作时是否在控制台打印SQL -->
<property name="show_sql">true</property>
<!-- 是否对SQL进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定 关联的关系/映射 文件,引入Bean的xml文件 -->
<!-- 注:不是打. 用/ -->
<!-- <mapping resource="entity1/Customer.hbm.xml"/>
<mapping resource="entity1/Order.hbm.xml"/> -->
<!-- <mapping resource="entity2/Customer.hbm.xml"/>
<mapping resource="entity2/Order.hbm.xml"/> -->
<mapping resource="entity3/Department.hbm.xml"/>
<mapping resource="entity3/Manager.hbm.xml"/>
</session-factory>
</hibernate-configuration>
HibernateTest测试类
public class HibernateTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
@Before
public void init() {
// 1.创建一个SessionFactory 对象
sessionFactory = null;
// 1.创建Configuration对象:对应Hibernate的基本配置信息和对象关系映射信息
// configure();读取配置文件,无参默认读取hibernate.cfg.xml
Configuration configuration = new Configuration().configure();
/**
* new Configuration 的几个方法
*
* 读取的是hibernate.properties配置文件
* 1:Configuration configuration = new Configuration();
*
* 读取配置文件,无参默认读取hibernate.cfg.xml
* 2:Configuration configuration = new Configuration().configure();
*
* 读取配置文件,读取指定xml,传入一个File
* 3:Configuration configuration = new Configuration().configure(file);
*/
// 2.创建一个ServiceRegistry对象
// Hibernate 的任何配置和服务都需要在该对象中注册后才有效
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
// 3.创建一个SessionFactory
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
// 2.创建一个Session对象
session = sessionFactory.openSession();
// 3.开启事物
transaction = session.beginTransaction();
}
@After
public void distroy() {
// 5.提交事物
transaction.commit();
// 6.关闭Session对象
session.close();
// 7.关闭SessionFactory对象
sessionFactory.close();
}
@Test
public void test1(){
Department dept = new Department();
dept.setDepyName("dept-a");
Manager mgr = new Manager();
mgr.setMgrName("mgr-a");
//设定关联关系
dept.setMgr(mgr);
mgr.setDept(dept);
/**
* 先插入Manager,后插入Department
* 2条INSERT,0条UPDATE
*/
session.save(mgr);
session.save(dept);
/**
* 先插入Department,后插入Manager
* 2条INSERT,1条UPDATE
* 原因:先插入Department时没有外键,插入Manager完后
* 需要更新Department的外键引用
*/
session.save(dept);
session.save(mgr);
}
@Test
public void test2(){
/**
* 1:默认情况下使用懒加载,department里不查询manager
* 则manager没有被赋值
* 2:会出现懒加载异常的问题
*/
//Department获取
Department dept = (Department) session.get(Department.class,1);
//释放session
session.close();
//此时获取Department里的Manager
Manager mgr = dept.getMgr();
//正常输出
System.out.println(mgr.getClass());
//懒加载异常
System.out.println(mgr.getMgrName());
}
}