3

単純なHibernateマッピングがあります

      <class name="com.domain.OtherAccount" table="ACCOUNT">
          <composite-id >
            <key-property name="acctype" column="acctype" type="java.lang.Character"></key-property>
            <key-property name="accnum" column="accnum" type="java.lang.Integer"></key-property>
          </composite-id>
         <property name="accholder"></property>
      </class>

コンポジットキー用に別のクラスを作成したくありません。したがって、acctypeとaccnumはOtherAccountクラスの一部です。クラスは、シリアル化可能なインターフェイスとhashCode()およびequals()メソッドを実装します。

session.save()を使用して、新しいオブジェクトを作成して永続化することができます。しかし、どうすれば既存のオブジェクトを取得できますか?session.get()メソッドで複合キーを指定する方法は?

  In session.get(OtherAccount.class, HOW TO SPECIFY COMPOSITE KEY HERE )
4

2 に答える 2

8

のインスタンスを作成し、OtherAccountこれら2つのフィールドだけを設定します。Hibernateは、インスタンスに必要以上のフィールドがあることを気にしません。

于 2012-11-14T08:38:05.453 に答える
0

@Aaronは正しい方法を提案しました。機能した。将来のユーザーを完全に理解するために、ここで詳しく説明します。

上記のマッピングに関して、Composite Key Value Accnum:-777のACCOUNTテーブルレコードがあるとします。

Acctype:-X

非キー列Accholder:-Kaushik

この方法でオブジェクトを取得して印刷しました:-

    OtherAccount oa1 = new OtherAccount();
    oa1.setAccholder("before retrieving");
    oa1.setAccnum(777);
    oa1.setAcctype('X');
    System.out.println("oa1.Accholder " + oa1.getAccholder());

    session.get(OtherAccount.class, oa1);

    System.out.println("oa1.Accholder " + oa1.getAccholder());

正しいレコードを取得し、「oa1」インスタンスにDBデータがロードされました。したがって、oa1.getAccholder()の最初のSOPは「取得前」に出力され、2番目のSOPはDBから「Kaushik」ig値を出力しました。

複合キーの比較に必要なため、hashCode()メソッドとequals()メソッドを実装することを忘れないでください。

于 2012-11-14T09:33:39.040 に答える