我们有一个@MappedSuperclass class Entity
来定义默认ID和生成器:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Override
public K getId() {
return id;
}
我想不要在子类Foo
中使用任何生成器,因为我将自己提供主键。
我必须从基类Foo
扩展Entity
,因为很多很多函数都依赖于这个基类。注释@AttributeOverrides
似乎不支持覆盖@GeneratedValue
。
答案 0 :(得分:0)
听起来像Foo
实际上并不是Entity
的子类型,并且永远不应该真正扩展它。继承是一份强有力的合同。你不会扩展一些东西只是为了访问一些方法。
在hibernate中,当你从数据库中获取Foo对象时,实际上你也是从Entity表中选择的。这两个表都是通过@Id
字段加入的,您会看到Id
中的Foo
与Id
中的Entity
相同。
这使我们能够做到以下几点。
Entity entity = new Foo();
if (entity instanceof Foo) {
//we have a Foo object
} else if( entity instanceof ...) {
//we have a ...
}
如果您想提供自己的ID,则不应再延长超类。如果你有很多逻辑要包含在许多hibernate类中,但它们并不是类的子类型,请考虑使用@Embedded
代替。