2011-12-26 19 views
1

我正在創建一個包含兩個主鍵的表。第一個是id(Integer),第二個是email(varchar2(50))。 我的映射文件包含如何使用加載方法,如果表中有兩個主鍵在休眠

<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()); 

你如何檢索數據如果表中包含兩個主鍵。請幫幫我。

回答

3

,你必須使用

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

和PKField必須實現.equals()和hashCode()方法, 休眠依靠這些方法來緩存和比較數據。

2

創建一個PKField的實例並將其傳遞給load()方法。

注意

確保您的複合鍵類滿足條件指定here

  • 它必須實現java.io.Serializable。
  • 它必須重新實現equals()和hashCode()與數據庫的複合關鍵字相等的概念一致。
0

複合標識表示記錄相同,如果全部部分複合標識匹配。也就是說,行

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

代表不同對象冬眠。因此,您需要將所有組合鍵的部分傳遞給load(...)以確定應加載的對象。

如果您的意圖是ID本身唯一標識一條記錄,並且電子郵件的標識相同,則聲明一個爲標識符,另一個標識爲natural-id。你可能不得不使用查詢來通過natural-id獲取實體(不確定,我從不使用它們)。