如部門經理對應一個部門
基于外鍵的一對一關聯關系
1.外鍵可以存放在任意一邊,在需要存放外鍵的一端增加many-to-one元素 并為其添加唯一約束unique="true"
2.另一端需要使用one-to-one元素,并使用property-ref屬性指定被關聯實體主鍵以外字段作為關聯字段
通過外鍵方式映射一對一關聯
對象一(部門)
//部門
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;
}
}
對象一(部門)映射文件: 建立一對多關系 為外鍵添加唯一約束
- 使用many-to-one 映射一對一關聯更新 unique="true"唯一約束
<hibernate-mapping>
<class name="chen.Department" table="DEPARTMENT">
<id name="depId" type="java.lang.Integer">
<column name="DEPID" />
<generator class="native" />
</id>
<property name="depName" type="java.lang.String">
<column name="DEPNAME" />
</property>
<!-- 使用many-to-one 映射一對一關聯更新
unique="true"唯一約束
-->
<many-to-one name="mgr" class="chen.Manager" column="MGR_ID" unique="true"> </many-to-one>
</class>
</hibernate-mapping>
部門數據表
對象二(經理)映射文件: 建立一對一關聯
- 使用 one-to-one映射一對一關聯關系
- 默認關聯對方OID
- property-ref="mgr"指定使用關聯實體主鍵以外的字段關聯 (對象屬性名)
<hibernate-mapping>
<class name="chen.Manager" table="MANAGER">
<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映射一對一關聯關系 -->
<!-- property-ref="mgr"指定使用關聯實體主鍵以外的字段關聯 (對象屬性名) -->
<one-to-one name="dep" class="chen.Department"
property-ref="mgr"></one-to-one>
</class>
</hibernate-mapping>
經理數據表
保存
- 建議先保存沒有外鍵列 減少update語句
/**
* 一對一關聯(外鍵) 保存
*/
public static void testOneToOneWSave() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Department department = new Department();
department.setDepName("研發部");
Manager manager = new Manager();
manager.setmName("張三");
// 設置關聯
department.setMgr(manager);
manager.setDep(department);
// 建議先保存沒有外鍵列 減少update語句
session.save(manager);
session.save(department);
transaction.commit();
session.close();
sessionFactory.close();
}
查詢
- 1.默認對關聯屬性使用懶加載
- 2.會出現懶加載異常
- 3.查詢manager 對象鏈接條件不對 property-ref="mgr"指定使用關聯實體主鍵以外的字段關聯
/**
* 一對一關聯(外鍵) 查詢
*/
public static void testOneToOneWGetA() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 1.默認對關聯屬性使用懶加載
// 2.會出現懶加載異常
Department department = session.get(Department.class, 1);
System.out.println(department.getDepName());
// 3.查詢manager 對象鏈接條件不對
Manager manager = department.getMgr();
System.out.println(manager.getmName());
transaction.commit();
session.close();
sessionFactory.close();
}
- 在查詢沒有外鍵的實體對象,使用的左外鏈接查詢,一并查詢出其關聯對象
/**
* 一對一關聯(外鍵) 查詢
*/
public static void testOneToOneWGetB() {
StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();// 配置文件configure()
SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Manager manager = session.get(Manager.class, 1);
System.out.println(manager.getmName());
// 在查詢沒有外鍵的實體對象,使用的左外鏈接查詢,一并查詢出其關聯對象
System.out.println(manager.getDep().getDepName());
transaction.commit();
session.close();
sessionFactory.close();
}