Hibernate数据库映射

时间:2012-03-26 13:52:28

标签: java hibernate

首先,我对Hibernate有些新意。要了解我在项目中使用它的技术。我正在尝试映射以下数据库:

Campaign
  campaignId(+)
  name

Promotion
  campaignId(+)
  discount(+)
  product
  message

我在两个案例中用(+)表示主键。 Promotion中的'campaignId'是Campaign为1:m映射建模的外键(A 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,discount,message。 (它也没有@ManyToOne注释。)

这有意义吗?

最后,这将是一等奖:你可以看到我正在使用Envers来审核整个事情。上面创建了一个相当丑陋的“CampaignEntity_PromotionEntity_AUD”表。我知道这是必要的,但我怎样才能将它重命名为CAMPAIGN_PROMOTION_AUD呢?

谢谢你们!


我在一个隐藏在Hibernate的Jira错误跟踪网站远角的孤独网站上得到了答案:https://hibernate.onjira.com/browse/HHH-3729

答案是使用@AuditJoinTable(name =“CAMPAIGN_PROMOTION_AUD”)。

3 个答案:

答案 0 :(得分:1)

这是一对多关系及其逆转的基本示例。

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

public class Promotion
{
    @ManyToOne
    private Campaign campaign;
}

答案 1 :(得分:1)

您可以使用EmbeddedId创建多字段PK。

  • Promotion
  • 中删除PK字段
  • 创建一个单独的实体,比如PromotionPK,除了PK字段上的@Column之外没有任何注释
  • Promotion中,将PK类包含为字段,使用@EmbeddedId注释,使用getter和setter

FK映射如Wouter所示。

答案 2 :(得分: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;

    ...
}

我也更喜欢注释字段而不是getter,因为它更紧凑,读起来更容易。