2012-04-24 10 views
1

私は関係マスタースレーブがあるとします。データベースには、id = 1のテーブルMasterに1つの行が存在します。 は、なぜ、この次のコードの作業を行います。分離エンティティを参照するのはなぜですか?jpa hibernate

Slave slave = new Slave(); 
    slave.setId(1L); 

    Master master = new Master(); 
    master.setId(1L); 
    slave.setMaster(master); 
    em.persist(slave); 

だから、マスターは、エンティティをデタッチし、後にスレーブとマスターの間refenceが作成されたコミットされています。どうして?私は、thikinfのケースでは、データベースから "find"関数を使ってMaster行を読み取る必要があると思います。 どこで詳細を読むことができますか?

+0

あなたのトランザクション境界とは何ですか?エンティティにはどのように注釈が付けられますか?詳細は、JPA 2.0の仕様をお読みください。 –

+0

この場合、JPAは指定されたマスタのIDのみを使用します。 JPAはすでにIDが1Lのマスターがテーブルに存在するため、新しく作成されたスレーブをうれしく挿入します。 –

答えて

1

休止状態の暗い土地へようこそ。それは、図のように最善の方法だ - まず第一に、あなたは何が起こっているか知りたい場合は、コンソールであなたのためにHibernateが実行されたすべてのSQLクエリが表示されます、あなたはhibernate.cfg.xmlにそれに

<property name="show_sql">true</property> 

感謝を追加しますHibernateが与えられた瞬間にどのように動作するかを示します。

予期しない結果に戻る。重要なのは、誰が関係を持っているかです。私の場合、スレーブテーブルには、マスターテーブルのプライマリキーを指す外部キーがあります(明らかに、テーブルをジョインすることもできます - 問題ではありません)。

Hibernateはリレーションシップを作成するときにリレーションシップを所有するサイドについてのみ気にします - あなたのケースでは、スレーブテーブルに新しいリレーションに関する情報を保存すれば十分です。実際、マスターは関係について知る必要はないので、そのエンティティでセーブを呼び出す必要はありません。それがあなたのコードが機能する理由です。

参考読む:

+0

私は、休止状態がマスターエンティティが管理されているかどうかを確認していないことを驚いていました。 – dpolaczanski

関連する問題