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

Xiè*_*léi 5 orm hibernate

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

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Override
public K getId() {
    return id;
}
Run Code Online (Sandbox Code Playgroud)

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

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

jax*_*jax 0

在我看来,Foo它实际上并不是它的子类型Entity,也不应该真正扩展它。继承是一种强有力的契约。您不会仅仅为了访问某些方法而扩展某个东西。

在 hibernate 中,当您从数据库获取 Foo 对象时,您实际上也是从实体表中进行选择。@Id两个表都通过它们的字段连接,您将看到Idin 中的与in 中Foo的相同。IdEntity

这使我们能够执行以下操作。

Entity entity = new Foo();
if (entity instanceof Foo) {
  //we have a Foo object
} else if( entity instanceof ...) {
  //we have a ...
}
Run Code Online (Sandbox Code Playgroud)

如果您想提供自己的 ID,则不应再扩展超类。如果您想要将大量逻辑包含到多个 hibernate 类中,但它们实际上并不是该类的子类型,请考虑使用它@Embedded