如何在休眠中重复嵌入类型

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;

如果所有列名都是唯一的,则此示例将按预期工作。

【讨论】:

以上是关于如何在休眠中重复嵌入类型的主要内容,如果未能解决你的问题,请参考以下文章

如何取消代理休眠对象[重复]

如何在嵌入式tomcat中禁用http方法[重复]

如何将Mysql中的位类型映射到休眠?

如何将 linq 中的参数类型设置为 char(*) 类型的休眠查询?

如何在我的网站中嵌入 ace 编辑器 [重复]

我正在尝试创建一个简单的休眠应用程序。它给出了以下错误。如何解决该错误[重复]