java - Hibernate子类id在每个子类的表中生成

标签 java hibernate jpa orm

当我使用每个子类一个表策略时,我的基类(父类)包含复合主类。

@Column(nullable = false)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "XXX")
@SequenceGenerator(name = "XXX", sequenceName = "XXX",  allocationSize = 1)
private Long systemId;

@Id
@Column(nullable = false)
private Long version; 

因此,扩展此属性的所有实体(据我所知)都会继承 ids 及其带注释的属性。 问题是,当我创建一个新的父实体时,主要是根据序列创建的,没关系。但是当我创建子类实例时,它会增加我不需要的父 ID(从 seq 创建一个新的主 ID),因为我使用每个子类的表,并且主 ID 必须相同。

问题:如何抑制子类中的 id 生成?

@Entity
@PrimaryKeyJoinColumns(
    {
            @PrimaryKeyJoinColumn(name = "systemId"),
            @PrimaryKeyJoinColumn(name = "version")
    }
)
public class SUb extends Parent {

public SUb (Parent t) {
    super(t);
}

public SUb () {
}
...

... no ids...

最佳答案

创建子类时,它将发出两个插入:

  1. 基类中的一个
  2. 子类中的一个

子类不继承@Ids,而是使用:

  • 系统ID
  • 版本

作为基表关联列的 FK。

因此,虽然基类具有由这两列组成的主键:

  • 生成的系统 ID 序列
  • 手动分配的版本

子类应该具有:

  • sequnceId 列,其 FK 指向基本 sepqunceId 列
  • 与基本版本列具有 FK 的版本列

因此在插入子类实体时不应调用该序列两次。

您能否确认数据库表遵循此设计?

关于java - Hibernate子类id在每个子类的表中生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24529473/

相关文章:

java - LONG 作为 Hibernate 映射到 MySQL 的主键

java - 当分离的实体版本属性为空时,为什么 Hibernate 实体管理器执行插入而不是更新?

java - 第二个程序窗口

java - Eclipse:抑制, "cannot be resolved to a type"

java - Gradle 一次运行多个 jar

java - 多个主键表 - Hibernate NonUniqueObjectException

java - 在同一个表中使用两个结果集时发生错误

java - HibernateCallback 最适合执行 SQL/过程吗?

java - 对于 MySql DB,在 Hibernate(部署在 JBoss 5.1.0 上)中使用大写(与下划线组合)作为列名时出现奇怪的行为

jpa - 从 EclipseLink 获取 JDBC 连接