2012-03-27 114 views
0

我仍然爲此而努力:Hibernate如何映射這個?

Hibernate database mapping

對不起,改寫和重新發布...

我根本就沒有工作,一旦我試圖實現他們的想法。最大的問題是似乎不兼容的PK/FK字段。這裏有兩個表我心目中:

Campaign 
    PK Long campaignId 
    String description 

Promotion 
    PK Long campaignId (FK to Campaign) 
    PK Long discount (unique set of discounts for the campaign) 
    String messgge 

(每個戰役都有許多促銷)

的問題是,促銷離不開運動物體存在。使用promotionIds非常繁瑣。我真正需要的是在對象模型中只有一個Campaign對象,我只需訪問與之相關的一組Promotions對象。每次促銷都只是打折和與之相關的消息。類似以下內容:

class Campaign { 
    Long campaignId; 
    String description; 
    Set<Promotion> promotions; 

    // constructors, getters, setters 
} 

class Promotion { 
    int discount; 
    String message; 

    // constructors, getters, setters 
} 

這是不是可能?我怎樣才能使用標準的JPA註釋使用Hibernate來映射它?我不再關心表格映射,只要我可以擁有上述的對象模型。

請... :(


編輯

我得到這個使用上,增進側的@ElementCollection工作,並從@Entity改變推廣到@Embeddable,這工作得很好,正是我所需要的,但是,現在審計突破了,因爲Envers拒絕使用清單

我知道campaignId和折扣表中的折扣是獨一無二的,但我如何告訴Envers呢?

+0

你在你的表和int折扣中有PK Long折扣;在你的班級,這是正確的?更確切地說:折扣是什麼意思 - 是推廣或引用另一張表的標識,還是某種價值,如百分比折扣? – 2012-03-27 06:49:22

+0

謝謝你的提問。每個廣告系列(包含獨特的廣告系列標識)都會提供不同折扣的促銷活動。 (例如活動1,可以提供10%,25%和66%的促銷)。沒有宣傳活動,促銷活動就不可能存在。因此,在Promotion表格中,campaignId和折扣的組合是唯一的(即另一個活動可以提供相同的折扣...但可能每個都有不同的消息)。查看我頂部的表格。這是否更有意義? – 2012-03-27 07:05:47

回答

0

Campaign類,你可以使用映射在簡單的情況下設定的Promotion S:

@OneToMany(mappedBy = "promotions") 
public Set<Promotoion> getPromotions() { 
    return promotions; 
} 

關於如何使用@OneToMany請參考12

+0

這是以任何方式可能與@ElementCollection?標準映射的問題是我需要在Promotion類中使用PK。如果我爲現有的廣告系列創建一組新的促銷,舊廣告不會被替換。我需要的只是添加和刪除一組新的促銷活動,就好像它是一個普通的字段。 – 2012-03-27 07:16:37

+1

事實上,它是......但它打破了審計...請參閱原始問題中的編輯。 – 2012-03-27 14:01:00