如何在Hibernate中处理在数据库中共享相同组合ID的多个表实体?

时间:2019-05-24 21:29:49

标签: java oracle hibernate jpa composite-primary-key

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

由于@SequenceGenerator生成了用于随后插入其他表的附加序列,因此我为每个其他表克隆了PK类,并删除了@SequenceGenerator,因此各列相同并且休眠不会t在插入过程中生成一个新序列。但是,这带来了另一个问题,即休眠状态期望与提供的状态不同的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 {}

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

0 个答案:

没有答案