2011-12-26 7 views
1

2つの主キーを持つテーブルを作成しています。最初のものはid(Integer)で、もう1つはemail(varchar2(50))です。 私のマッピングファイルがテーブルに2つの主キーがハイバネーションである場合にloadメソッドを使用する方法

<hibernate-mapping package="suri.sahasra"> 
    <class name="Person" table="PERSONS"> 
     <composite-id name="pkField" class="PKField"> 
      <key-property name="personId" column="person_id"/> 
      <key-property name="email" column="email"/> 
     </composite-id> 

     <property name="firstName" column="first_name"/> 
     <property name="lastName" column="last_name"/> 
     <property name="age" column="age"/> 
    </class> 
</hibernate-mapping> 

が含まれている今、私はloadメソッドを使用してデータを選択しようとしていますが、それはtypeMisMatch例外を上げています。
マイロード機能は次のとおりです。

Person p1=(Person) ss.load(Person.class,new Integer("1")); 
System.out.println(p1.getFirstName()); 
System.out.println(p1.getLastName()); 
System.out.println(p1.getAge()); 

テーブルが2つの主キーが含まれている場合は、データを取得するにはどうすればよいです。私を助けてください。

答えて

3

あなたは

Person p1=(Person) ss.load(Person.class,new PKField("1","email")); 

を使用する必要がありますとPKFieldは.equalsを実装する必要があります()とhashCode()メソッドは、 Hibernateがデータをキャッシュし、比較するために、これらの方法に依存しています。

2

PKFieldのインスタンスを作成し、load()メソッドに渡します。

NOTE

あなたの複合キークラスは条件がそれはjava.io.Serializableを実装しなければなりませんhere

  • を指定満たしていることを確認します。
  • データベースのコンポジットキーの等価性の概念と一貫してequals()とhashCode()を再実装する必要があります。
0

composite-idは、複合idのすべて部分が一致する場合、レコードが同一であることを意味します。すなわち、行

ID | EMAIL 
----+------------------- 
1 | [email protected] 
1 | [email protected] 

が休止状態に異なるオブジェクトを表しています。したがって、load(...)にすべてのの複合キーを渡して、ロードするオブジェクトを識別する必要があります。

IDがレコードを一意に識別し、電子メールに同じIDを指定する場合は、識別子をIDとして、もう1つをnatural-idと宣言します。クエリを使用して自然なIDでエンティティを取得する必要があるかもしれません(わかりませんが、自分では使用しません)。

関連する問題