2012-03-26 244 views
1

首先,我對Hibernate有點新。要了解我在一個項目中使用它的技術。我試圖映射以下數據庫:休眠數據庫映射

Campaign 
    campaignId(+) 
    name 

Promotion 
    campaignId(+) 
    discount(+) 
    product 
    message 

我已經在(+)兩種情況下指出了主鍵。 Promotion中的'campaignId'是Campaign建立1:m映射模型的外鍵(一個Campaign有許多促銷活動)。使用註釋我堅持如何做到這一點。

我真的不想在Promotion表中添加promotionId,因爲它使得數據繁瑣。這當然會使橋接表有點棘手。我也遇到了使用也是主鍵一部分的外鍵的問題。

是否可以完成這一映射?


好的,我得到了它的工作。有點。必須檢查持久性是否真的有效。我做了以下內容:

@Entity 
@Table(name = "CAMPAIGNS") 
@Audited 
public class CampaignEntity { 
    private int campaignId; 
    private String name; 
    private List<PromotionEntity> promotions; 

    public CampaignEntity(int campaignId, String name) { 
     this.campaignId = campaignId; 
     this.name = name; 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "cmp_id") 
    public int getCampaignId() { 
     return campaignId; 
    } 

    public void setCampaignId(int campaignId) { 
     this.campaignId = campaignId; 
    } 

    // Campaign name here... left out to save space 

    @OneToMany 
    @JoinColumn(name = "cmp_id") 
    public List<PromotionEntity> getPromotions() { 
     return promotions; 
    } 

    public void setPromotions(List<PromotionEntity> promotions) { 
     this.promotions = promotions; 
    } 
} 

推廣是香草映射(不使用後,所有的嵌入式),與字段:CAMPAIGNID,折扣,消息。 (它也沒有@ManyToOne批註。)

這有道理嗎?

最後,這將是一等獎:你可以看到我正在使用Envers審計整個事情。上面創建了一個相當醜陋的「CampaignEntity_PromotionEntity_AUD」表。我知道這是必要的,但我怎樣才能將它重命名爲CAMPAIGN_PROMOTION_AUD?

謝謝你們!


我得到了一個孤獨的網站深深地隱藏在Hibernate的吉拉錯誤跟蹤網站的遠角落的答案:https://hibernate.onjira.com/browse/HHH-3729

答案當然是使用@AuditJoinTable(name =「CAMPAIGN_PROMOTION_AUD」)。

+0

您的意思是您可能不希望在* Campaign *表格中使用promotionId?我不確定這是否合理。 – 2012-03-26 14:05:02

+0

更正後,廣告系列ID應作爲單個列(cmp_id)存儲在促銷表中,該列也是促銷主鍵的一部分。 (見上)。我想我已經與上面編輯的解決方案,謝謝你的幫助。 – 2012-03-26 16:46:46

回答

0

這就是我現在使用的。它運作良好,Hibernate爲我處理促銷活動的PK。再次感謝。

@Entity 
@Table(name = "CAMPAIGNS") 
@Audited 
public class CampaignEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false) 
    private Integer campaignId; 

    @Column(name = "name", nullable = false, unique = true) 
    private String campaignName; 

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
    @JoinTable(name = "CAMPAIGN_PROMOTIONS", 
       joinColumns = { @JoinColumn(name = "campaign_id") }, 
       inverseJoinColumns = { @JoinColumn(name = "promotion_id") }) 
    private Set<PromotionEntity> promotions; 

    ... 
} 

然後,PromotionEntity:

@Entity 
@Table(name = "PROMOTIONS") 
@Audited 
public class PromotionEntity implements Comparable<PromotionEntity> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @Column(name = "discount", nullable = false) 
    private Integer discount; 

    @Column(name = "message", nullable = false) 
    private String message; 

    ... 
} 

我也喜歡註釋字段,而不是干將,因爲它是更緊湊,更易於讀取。

1

這是一對多關係及其相反的基本示例。

public class Campaign 
{ 
    @OneToMany(mappedBy = "campaign) 
    private List<Promotion> promotions; 
} 

public class Promotion 
{ 
    @ManyToOne 
    private Campaign campaign; 
} 
+0

這不太合適......「廣告系列廣告系列」條目很難將其定義爲促銷主鍵的一部分。我需要「campaign_id」作爲此表中的外鍵,同時也是Promotion主鍵的一部分。 「活動ID」與「折扣」一起定義了該實體的唯一性。 – 2012-03-26 16:10:43

+1

它爲什麼需要成爲主鍵的一部分?只需使用非業務PK(即「id」字段)並將您的業務密鑰定義爲(唯一)索引。 – 2012-03-27 10:44:33

+0

當廣告系列從前端更新後,我會收到一個包含一組促銷(包含折扣,產品和消息)的廣告系列。我現在必須編寫查詢來查找所有促銷活動的PK,只需更新活動即可。 (請記住,我沒有從集合中獲得PK。)這聽起來很不對。 – 2012-03-27 13:53:29

1

您可以使用EmbeddedId創建一個多字段PK。

  • Promotion
  • 卸下PK字段創建一個單獨的實體,說PromotionPK外,不@Column對PK字段的任何註解
  • Promotion,包括PK類作爲字段,使用@EmbeddedId註釋它,用吸氣劑和吸氣劑

FK映射如Wouter所示。

+0

你介意舉個簡單的例子嗎?我不知道如何使用這個組合鍵來映射@ManyToOne註解......這是哪裏去的?在組合鍵或Promotion類中? – 2012-03-26 16:11:45

+0

我已經整理過了......感謝您的幫忙。 – 2012-03-26 17:31:42