Hibernate 如何覆盖在映射超类中声明的@GeneratedValue?
我们有一个Hibernate 如何覆盖在映射超类中声明的@GeneratedValue?,hibernate,orm,Hibernate,Orm,我们有一个@MappedSuperclass类实体,它定义了默认id和生成器: @Id @GeneratedValue(strategy = GenerationType.AUTO) @Override public K getId() { return id; } 我不想在子类Foo中使用任何生成器,因为我将自己提供主键 我必须从基类Entity扩展Foo,因为很多很多函数都依赖于这个基类。注释@AttributeOverrides似乎不支持覆盖@GeneratedValue 听起来
@MappedSuperclass类实体
,它定义了默认id和生成器:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Override
public K getId() {
return id;
}
我不想在子类Foo
中使用任何生成器,因为我将自己提供主键
我必须从基类
Entity
扩展Foo
,因为很多很多函数都依赖于这个基类。注释@AttributeOverrides
似乎不支持覆盖@GeneratedValue
听起来好像Foo
实际上不是实体的子类型,也不应该真正扩展它。继承是一项强有力的契约。您不会仅仅为了访问某些方法而扩展某个东西
在hibernate中,当您从数据库中获得一个Foo对象时,实际上您也在从实体表中进行选择。这两个表通过其@Id
字段连接,您将看到Foo
中的Id
与实体中的Id
相同
这使我们能够做到以下几点
Entity entity = new Foo();
if (entity instanceof Foo) {
//we have a Foo object
} else if( entity instanceof ...) {
//we have a ...
}
如果你想提供你自己的Id,你不应该再扩展这个超级类。如果有很多逻辑要包含在许多hibernate类中,但它们实际上不是类的子类型,考虑使用<代码>嵌入式/<代码> > 可能的副本,我认为解已经提到他的基类是一个映射的超类而不是实体,所以他的Maple DuffC类不会被映射到一个表,所以连接的问题不会到达。在基类中为id使用抽象方法,并在派生类中注释getter方法似乎是最好的方法。