2009-08-26 19 views
0

我使用java持久性來保存與另一個實體關聯的實體列表。以下是我遇到問題的簡要說明。堅持使用複合鍵的元素列表

@Entity public class Offer implements Serializable { 
    @Id private Long offerId; 

    @OneToMany 
    @Column List<OfferCategory> offerCategories; 
} 

@Entity public class OfferCategory implements Serializable { 

    @Embeddable public static class Id implements Serializable 
    { 
     @Column(name="offer_id") 
     private Long offerId; 

     @Column(name="category_id") 
     private Long categoryId; 

     public Id() {} 

     public Id(Long offerId, Long categoryId) { 
      this.offerId = offerId; 
      this.categoryId = categoryId; 
     } 

     public boolean equals(Object o) { 
      if(o != null && o instanceof Id) { 
       Id other = (Id) o; 
       return this.offerId.equals(other.offerId) && 
         this.categoryId.equals(other.categoryId); 
      } 
      else 
       return false; 
     } 

     public int hashCode() { 
      return offerId.hashCode() + categoryId.hashCode(); 
     } 
    } 
    @EmbeddedId private Id id = new Id(); 
} 

從本質上講,由於架構我不能改變,我需要分類的列表保存爲被分配到報價。

現在,我得到用戶的類別列表,然後將它們放入Offer的offerCategories字段。但是,這對於新商品無效,因爲我無法設置新商品的ID。

我是JPA和Seam的新手,所以如果有人能在正確的方向給我一個微調,將不勝感激。

回答

0

嗯,我現在的解決方案是堅持每一個(爲新條目創建鍵),然後將它們填充到列表中,然後將它們填充到它們的容器對象中,然後保留該對象。

0

我以前沒有嘗試過使用複合ID,但需要注意的一點是,@Column僅用於更改字段正在使用的數據庫列的屬性。它並沒有規定的關係,所以你仍然需要像這樣:

@OneToMany  
List<OfferCategory> offerCategories; 
0

當我看着教程中,我發現this

不能使用IdentifierGenerator產生組合鍵。相反,應用程序必須分配自己的標識符。

所以你必須自己分配id。也許你可以創建一個DB序列並通過本地查詢獲取它的值?
還有一點 - 如果你想使用列表映射(Offer中的類別順序是由數據庫定義的),你需要一個索引列來包含列表中的索引。如果類別順序不重要,Set會更方便。

+0

但是,如果他們都是優惠的子女,並且我爲他們分配了一個類別,那麼不應該能夠在爲新優惠分配新ID的同時填寫該ID嗎? – 2009-08-29 00:26:09