【问题标题】: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 只是一个包装字符串的对象,但我想保留该类型,以便稍后添加行为/规则。

任何建议允许这种类型的配置?

【问题讨论】:

    标签: java hibernate


    【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 2012-10-29
        • 1970-01-01
        • 1970-01-01
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 2021-02-02
        相关资源
        最近更新 更多