Hibernateのプライマリ・キー・マッピングに基づく一対一の関連関係


1.プライマリ・キーに基づくマッピング・ポリシー:一端のプライマリ・キー生成器がforeignポリシーを用いる、「相手」のプライマリ・キーに基づいて自分のプライマリ・キーを生成することを示し、自分は独立してプライマリ・キーを生成することができない.サブエレメントを使用して、現在の永続化クラスのどのプロパティを「相手」として使用するかを指定します.
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();
	}

}