Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 如何覆盖在映射超类中声明的@GeneratedValue?_Hibernate_Orm - Fatal编程技术网

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方法似乎是最好的方法。