基于主鍵一對一
1.一端主鍵生成器使用foreign策略,表明根據對方主鍵來生成自己的主鍵,自己不獨立生成主鍵,<param>子元素指定使用當前持久化類那個屬性最為對方
2.采用foreign策略的一端增加one-to-one元素映射關聯(lián)屬性,并增加constarined="true"屬性;另一端增加one-to-one元素映射關聯(lián)屬性。
3.constarined(約束)指定當前持久化類對應的數據表的主鍵添加一個外鍵約束,引用被關聯(lián)的對象所對應的數據表主鍵
第一個對象(部門)
//部門
public class Department {
private Integer depId;
private String depName;
private Manager mgr;
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
public Integer getDepId() {
return depId;
}
public void setDepId(Integer depId) {
this.depId = depId;
}
public String getDepName() {
return depName;
}
public void setDepName(String depName) {
this.depName = depName;
}
第二個對象(經理)
//經理
public class Manager {
private Integer mId;
private String mName;
private Department dep;
public Integer getmId() {
return mId;
}
public void setmId(Integer mId) {
this.mId = mId;
}
public String getmName() {
return mName;
}
public void setmName(String mName) {
this.mName = mName;
}
public Department getDep() {
return dep;
}
public void setDep(Department dep) {
this.dep = dep;
}
}
第一個對象(部門)映射文件
使用外鍵方式生成當前主鍵<generator class="foreign">
property指定當前持久化類那個屬性的主鍵作為外鍵
采用foreign策略的一端增加one-to-one元素映射關聯(lián)屬性,并增加constarined="true"屬性以使當前主鍵使用外鍵約束
<hibernate-mapping>
<class name="cheniso.Department" table="DEPARTMENTISO">
<id name="depId" type="java.lang.Integer">
<column name="DEPID" />
<!-- 使用外鍵方式生成當前主鍵 -->
<generator class="foreign">
<!-- property指定當前持久化類那個屬性的主鍵作為外鍵 -->
<param name="property">mgr</param>
</generator>
</id>
<property name="depName" type="java.lang.String">
<column name="DEPNAME" />
</property>
<!-- 采用foreign策略的一端增加one-to-one元素映射關聯(lián)屬性,并增加constarined="true"屬性以使當前主鍵使用外鍵約束
-->
<one-to-one name="mgr" class="cheniso.Manager" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
部門表
第二個對象(經理)映射文件
<hibernate-mapping>
<class name="cheniso.Manager" table="MANAGERISO">
<id name="mId" type="java.lang.Integer" access="field">
<column name="MID" />
<generator class="native" />
</id>
<property name="mName" type="java.lang.String" access="field">
<column name="MNAME" />
</property>
<one-to-one name="dep" class="cheniso.Department"></one-to-one>
</class>
</hibernate-mapping>
經理表
保存
- 沒有先后順序 都不會有多余SQL
public static void testOneToOneSave() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
cheniso.Department department = new cheniso.Department();
department.setDepName("研發(fā)部");
cheniso.Manager manager = new cheniso.Manager();
manager.setmName("張三");
// 設置關聯(lián)
department.setMgr(manager);
manager.setDep(department);
// 沒有先后順序 都不會有多余SQL
session.save(manager);
session.save(department);
transaction.commit();
session.close();
sessionFactory.close();
}
查詢
/**
* 一對一關聯(lián)(主鍵) 查詢
*/
public static void testOneToOneGet() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 1.默認對關聯(lián)屬性使用懶加載
// 2.會出現(xiàn)懶加載異常
cheniso.Department department = session.get(cheniso.Department.class, 1);
System.out.println(department.getDepName());
cheniso.Manager manager = department.getMgr();
System.out.println(manager.getmName());
transaction.commit();
session.close();
sessionFactory.close();
}