1

私が関係マスタースレーブを持っているとしましょう。データベースには、テーブル Master に id=1 の行が 1 つ存在します。この次のコードが機能する理由:

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

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

したがって、マスターは切り離されたエンティティであり、コミット後にスレーブとマスターの間の参照が作成されます。なんで?場合によっては、「検索」機能によってデータベースからマスター行を読み取る必要があると思いました。詳細はどこで確認できますか?

4

1 に答える 1

1

Hibernate 関係の暗い土地へようこそ。まず、何が起こっているのかを知りたい場合は、hibernate.cfg.xml に追加します。

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

そのおかげで、Hibernate によって実行されたすべての SQL クエリがコンソールに表示されます。これは、特定の瞬間に Hibernate がどのように機能するかを理解するための最良の方法です。

予想外の結果に戻ります。重要なのは、誰が関係を所有しているかです。あなたの場合、スレーブテーブルにはマスターテーブルの主キーを指す外部キーがあると思います(明らかに結合テーブルも使用できます-問題ありません)。

Hibernate は、関係を作成するときに、関係を所有する側のみを気にします。あなたの場合、新しい関係に関する情報を Slave テーブルに保存するだけで十分です。実際、Master はリレーションについて知る必要がないため、そのエンティティに対して save を呼び出す必要はありません。それがあなたのコードが機能する理由です。

役に立つ読み物:

于 2012-04-24T22:13:08.087 に答える