如何在休眠中重复嵌入类型
Posted
技术标签:
【中文标题】如何在休眠中重复嵌入类型【英文标题】:How to repeat embedded type in hibernate 【发布时间】:2011-09-09 12:12:30 【问题描述】:我有一个试图在 Hibernate 3.6.x 中映射的类
@Entity @Table(name = "address") @Inheritance()
public abstract class Address
@Column(name = "address_type") @Enumerated(EnumType.STRING)
private final AddressType addressType;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line1")))
private final AddressLine addressLine1;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line2")))
private final AddressLine addressLine2;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line3")))
private final AddressLine addressLine3;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line4")))
private final AddressLine addressLine4;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line5")))
private final AddressLine addressLine5;
@Embedded @AttributeOverrides(@AttributeOverride(name = "postcode", column = @Column(name = "postcode")))
private final Postcode postcode;
我收到此错误。 (我不完全理解 - 有人可以解释一下吗?)
实体映射中的重复列: 地址栏:addressLine(应 用 insert="false" update="false" 映射)
虽然@Embeddable AddressLine 只是一个包装字符串的对象,但我想保留该类型,以便稍后添加行为/规则。
任何建议允许这种类型的配置?
【问题讨论】:
【参考方案1】:我没有使用过@AttributeOverride,但我知道这个错误信息。这是由同名列的多个映射引起的,在这种情况下,这意味着 Hibernate 忽略了您的列覆盖定义。
但是,就我而言,我使用的是 @ManyToOne 类,因此解决方案是 @JoinColumns 定义覆盖原始列名。
【讨论】:
【参考方案2】:我很惭愧地说我从这个问题中得到的错误是由于复制和粘贴犯罪。
虽然不在问题代码中,但在我的实际代码库中,重复的 AddressLines 1、2、3 和 4 中的 @Column 注释名称值没有更改为唯一。
例如 - 这是 BAD 因为两个 @Column 名称值与“address_line1”相同
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line1")))
private final AddressLine addressLine1;
@Embedded @AttributeOverrides(@AttributeOverride(name = "addressLine", column = @Column(name = "address_line1")))
private final AddressLine addressLine2;
如果所有列名都是唯一的,则此示例将按预期工作。
【讨论】:
以上是关于如何在休眠中重复嵌入类型的主要内容,如果未能解决你的问题,请参考以下文章