JPA/Hibernate-使用@SecondaryTable的混合继承策略会导致主键冲突

JPA/Hibernate-使用@SecondaryTable的混合继承策略会导致主键冲突,hibernate,jpa,inheritance,polymorphism,secondary-table,Hibernate,Jpa,Inheritance,Polymorphism,Secondary Table,我在尝试使用JPA实现混合继承策略时遇到了一个问题。在使用Hibernate 5.2.18(JPA 2.1)、5.3.5(JPA 2.2)和5.4.22(JPA 2.2)时,观察到了相同的行为(两个插入-每个子类级别一个) 我相信我的实现与这些线程中的建议是一致的,但也许有一点我没有注意到: @实体 @表(name=“表A”) @继承(策略=InheritanceType.SINGLE_表) 抽象A类{ @身份证 @GeneratedValue(策略=GenerationType.IDE

我在尝试使用JPA实现混合继承策略时遇到了一个问题。在使用Hibernate 5.2.18(JPA 2.1)、5.3.5(JPA 2.2)和5.4.22(JPA 2.2)时,观察到了相同的行为(两个插入-每个子类级别一个)

我相信我的实现与这些线程中的建议是一致的,但也许有一点我没有注意到:

@实体
@表(name=“表A”)
@继承(策略=InheritanceType.SINGLE_表)
抽象A类{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
公共无效集合id(长id){
this.id=id;
}
公共长getId(){
返回id;
}
}
@实体
@第二个表(name=“TABLE_B”)
@鉴别器值(“B”)
B类扩展了A类{
@列(table=“table_B”)
私有字符串属性1;
公共字符串getProperty1(){
归还财产1;
}
公共void setProperty1(字符串property1){
this.property1=property1;
}
}
@实体
@第二个表(name=“TABLE_B”)
@鉴别器值(“C”)
C类扩展到B类{
@列(table=“table_B”)
私有字符串属性2;
公共字符串getProperty2(){
归还财产2;
}
公共void setProperty2(字符串property2){
this.property2=property2;
}
}
试图持久化(插入)类型为
C
的对象将导致hibernate尝试在
表B
中执行两次插入:

insert into TABLE_A (id, DTYPE) values (null, 'C')
Natively generated identity: 2
insert into TABLE_B (property1, id) values (?, ?)
binding parameter [1] as [VARCHAR] - [foo]
binding parameter [2] as [BIGINT] - [2]
insert into TABLE_B (property2, id) values (?, ?)
binding parameter [1] as [VARCHAR] - [bar]
binding parameter [2] as [BIGINT] - [2]
could not execute statement [n/a] 
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation: "PRIMARY KEY ON TABLE_B(ID) [2, 'foo', NULL]"; 
最后,如果我将
B
更改为
@MappedSuperclass
而不是
@Entity
,我可以正确地保留
C
对象,但这会改变语义,我无法再保留
B
对象,因为它们本身不再是实体

谢谢

编辑:

这是我的DDL:

CREATE TABLE_A(
ID BIGINT标识非空主键,
数据类型VARCHAR(16)不为空
);
创建表(
ID BIGINT标识非空主键,
房地产1 VARCHAR(32),
房地产2 VARCHAR(32),
约束FK_表_B_父外键(ID)引用表_A(ID)
);

我想附上一张ER图,但由于这是我的第一篇帖子,我没有最低限度的声誉,这使我可以这样做。

我还应该补充说,这个问题类似于未回答的问题,但上下文不同。请您出示架构相关部分的ER图。我还应该补充说,这个问题类似于未回答的问题,但上下文不同。请您理解显示模式相关部分的ER图。