【问题标题】:Is there a way to override inherited generation strategy?有没有办法覆盖继承的生成策略?
【发布时间】:2011-10-10 09:25:28
【问题描述】:

我正在扩展一个不会自动生成其 ID 的实体。

我想在派生类中将其生成策略“覆盖”为 AUTO。

类似的东西。

@Entity
public class Base {

    @Id
    @Column(name = "id")
    public Integer getId() {
      return id;
    }

}

@Entity
public class Extender extends Base {

    @GeneratedValue(strategy = GenerationType.AUTO)
    public Integer getId() {
        return super.getId();
    }
}

这就是我尝试这样做时得到的结果:

Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: Extender column: id (should be mapped with insert="false" update="false")

我明白为什么会发生这种情况,但我需要知道是否有有效的方法来做到这一点。

谢谢,

【问题讨论】:

    标签: java hibernate inheritance jpa


    【解决方案1】:

    这是不可能的,因为你只能定义一次主键,而 GeneratedValue 只能在定义主键的地方。与规范中的文字相同:

    2.4 主键和实体标识
    ...主键必须在实体层次结构中定义一次。

    11.1.17 生成值注解
    ... GeneratedValue 注释可以与 Id 注释一起应用于实体或映射超类的主键属性或字段。

    【讨论】:

      【解决方案2】:

      这看起来不正确。如果你想使用继承,你必须要么

      • 在基类中指定@javax.persistence.Inheritance,并选择如何映射继承的策略(枚举InheritanceType
      • @javax.persistence.MappedSuperclass注释类Base

      还可以查看注释@javax.persistence.Transient,它使您可以在超类或超接口中定义属性,而无需在其中指定映射。

      我根本不喜欢数据模型中的继承,因为开发人员倾向于使用 instanceof 运算符,如果您没有实体类的实际实例而是 Hibernate 生成的代理,这将在运行时产生意想不到的结果对象(在延迟加载的情况下)。

      【讨论】:

      • 指定javax.persistence.Inheritance 不是强制性的,默认为SINGLE_TABLE。我没有在此处包含所有代码,请假设它是正确且有效的(@Id 部分除外)。
      • 你的意思是我可以在我的基类ID上指定@Transient,然后在派生类中进一步定义它?
      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 2012-08-29
      • 1970-01-01
      • 2010-11-22
      • 2015-10-14
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      相关资源
      最近更新 更多