首页 > 解决方案 > 如何在 Hibernate 中处理在数据库中共享相同复合 id 的多个表实体?

问题描述

我的主表有一个复合主键,其中一个字段是一个序列。它与其他两个表具有一对一的关系,其中复合键是这些各自表的主键/外键。在我的 java 代码中,我有一个包含@SequenceGenerator. 由于列在表之间共享,我尝试让我的实体都使用相同的 PK 类。但是,由于我的 PK 类有一个具有 的字段,因此@SequenceGenerator每当我尝试插入外键表时,休眠都会生成一个额外的序列,并且由于找不到父键而导致插入失败。

由于@SequenceGenerator为后续插入到其他表中生成了一个额外的序列,我为每个其他表克隆了我的 PK 类并删除了,@SequenceGenerator所以列是相同的,hibernate 在插入期间不会生成新序列。然而,这产生了另一个问题,即 hibernate 期望与提供的 PK 类不同的 PK 类。

public class AddrEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @SequenceGenerator(name = "ADDR_SEQ", sequenceName = "ADDR_SEQ", allocationSize = 1)
    @GeneratedValue(generator = "ADDR_SEQ")
    private long addrSeqNum;
}

public class PhoneEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @Id
    private long addrSeqNum;
}

public class ElecrMailEntityPK implements Serializable {
    @Id
    private long addrTyId;
    @Id
    private long addrSeqNum;
}

@Entity
@IdClass(AddrEntityPK.class)
public class AddrEntity {}

@Entity
@IdClass(PhoneEntityPK.class)
public class PhoneEntity {}

@Entity
@IdClass(ElecrMailEntityPK.class)
public class ElecrMailEntity {}

由于列名相同,我希望 hibernate 不会生成异常,而是会抛出org.hibernate.TypeMismatchException: Provide id of the wrong type for class AddrEntity. Expected AddrEntityPK, got class PhoneEntityPK

标签: javaoraclehibernatejpacomposite-primary-key

解决方案


推荐阅读