Hibernateのプライマリ・キー・マッピングに基づく一対一の関連関係
4980 ワード
1.プライマリ・キーに基づくマッピング・ポリシー:一端のプライマリ・キー生成器がforeignポリシーを用いる、「相手」のプライマリ・キーに基づいて自分のプライマリ・キーを生成することを示し、自分は独立してプライマリ・キーを生成することができない.サブエレメントを使用して、現在の永続化クラスのどのプロパティを「相手」として使用するかを指定します.
2.foreignプライマリ・キー・ジェネレータ・ポリシーの一端にone-to-one要素のマッピング関連属性を追加し、one-to-one属性にはconstrained=「true」属性を追加する必要があります.もう一方の端にone-to-one要素マッピング関連属性を追加
3.constrained(制約):現在の永続化クラスに対応するデータベース・テーブルのプライマリ・キーに外部キー制約を追加し、関連するオブジェクト(「相手」)に対応するデータベース・テーブルのプライマリ・キーを参照します.
4.ユニットテストサンプルコード:
マッピングする必要がある2つのエンティティクラス:
2.foreignプライマリ・キー・ジェネレータ・ポリシーの一端にone-to-one要素のマッピング関連属性を追加し、one-to-one属性にはconstrained=「true」属性を追加する必要があります.もう一方の端にone-to-one要素マッピング関連属性を追加
3.constrained(制約):現在の永続化クラスに対応するデータベース・テーブルのプライマリ・キーに外部キー制約を追加し、関連するオブジェクト(「相手」)に対応するデータベース・テーブルのプライマリ・キーを参照します.
4.ユニットテストサンプルコード:
マッピングする必要がある2つのエンティティクラス:
public class Manager {
private int mgrId;
private String mgrName;
private Department dept;
public int getMgrId() {
return mgrId;
}
public void setMgrId(int 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;
}
}
public class Department {
private int deptId;
private String deptname;
private Manager mgr;
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
public Manager getMgr() {
return mgr;
}
public void setMgr(Manager mgr) {
this.mgr = mgr;
}
}
2個のエンティティクラスはそれぞれそのhbmマッピングファイルに対して<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-25 22:25:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="com.elgin.hibernate.one2one.primary.Manager" table="MANAGER">
<id name="mgrId" type="int">
<column name="MGRID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGRNAME" />
</property>
<one-to-one name="dept" class="com.elgin.hibernate.one2one.primary.Department"></one-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2015-9-25 22:25:22 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping package="com.elgin.hibernate.one2one.primary">
<class name="Department" table="DEPARTMENT">
<id name="deptId" type="int">
<column name="DEPTID" />
<!-- -->
<generator class="foreign" >
<!-- property -->
<param name="property">mgr</param>
</generator>
</id>
<property name="deptname" type="java.lang.String">
<column name="DEPTNAME" />
</property>
<one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
5. ユニットテストクラス:public class HibernateTest2 {
// ,
private SessionFactory sessionFactory;
private Session session;
private Transaction transcation;
@Before
public void init(){
Configuration cfg=new Configuration().configure();
ServiceRegistry serviceRegistry=new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
sessionFactory=cfg.buildSessionFactory(serviceRegistry);
session=sessionFactory.openSession();
transcation=session.beginTransaction();
}
@Test
public void testOne2OnePrimarySave(){
Manager mgr=new Manager();
mgr.setMgrName("XXXfffff");
Department dept=new Department();
dept.setDeptname(" rrr");
dept.setMgr(mgr);
mgr.setDept(dept);
// update
session.save(dept);
session.save(mgr);
}
@Test
public void testOne2OnePrimaryGet(){
//1. , , ,
//2. session
Department dept=(Department) session.get(Department.class, 1);
System.out.println(dept.getDeptname());
//3.
Manager mgr=(Manager) session.get(Manager.class, 1);
System.out.println(mgr.getMgrName());
}
@After
public void destory(){
transcation.commit();
session.close();
sessionFactory.close();
}
}