如何覆盖在mapped-superclass中声明的@GeneratedValue?

时间:2011-04-25 04:04:05

标签: hibernate orm

我们有一个@MappedSuperclass class Entity来定义默认ID和生成器:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Override
public K getId() {
    return id;
}

我想不要在子类Foo中使用任何生成器,因为我将自己提供主键。

我必须从基类Foo扩展Entity,因为很多很多函数都依赖于这个基类。注释@AttributeOverrides似乎不支持覆盖@GeneratedValue

1 个答案:

答案 0 :(得分:0)

听起来像Foo实际上并不是Entity的子类型,并且永远不应该真正扩展它。继承是一份强有力的合同。你不会扩展一些东西只是为了访问一些方法。

在hibernate中,当你从数据库中获取Foo对象时,实际上你也是从Entity表中选择的。这两个表都是通过@Id字段加入的,您会看到Id中的FooId中的Entity相同。

这使我们能够做到以下几点。

Entity entity = new Foo();
if (entity instanceof Foo) {
  //we have a Foo object
} else if( entity instanceof ...) {
  //we have a ...
}

如果您想提供自己的ID,则不应再延长超类。如果你有很多逻辑要包含在许多hibernate类中,但它们并不是类的子类型,请考虑使用@Embedded代替。