首先,我对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”)。
答案 0 :(得分:1)
这是一对多关系及其逆转的基本示例。
public class Campaign
{
@OneToMany(mappedBy = "campaign)
private List<Promotion> promotions;
}
public class Promotion
{
@ManyToOne
private Campaign campaign;
}
答案 1 :(得分:1)
您可以使用EmbeddedId
创建多字段PK。
Promotion
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,因为它更紧凑,读起来更容易。