Java 如何在Hibernate中处理数据库中共享相同复合id的多个表实体?
我的主表有一个复合主键,其中一个字段是序列。它与另外两个表有一对一的关系,其中复合键是这些表的主键/外键。在我的java代码中,我有一个PK类,它包含一个Java 如何在Hibernate中处理数据库中共享相同复合id的多个表实体?,java,oracle,hibernate,jpa,composite-primary-key,Java,Oracle,Hibernate,Jpa,Composite Primary Key,我的主表有一个复合主键,其中一个字段是序列。它与另外两个表有一对一的关系,其中复合键是这些表的主键/外键。在我的java代码中,我有一个PK类,它包含一个@SequenceGenerator。因为列在表之间共享,所以我尝试让我的实体都使用相同的PK类。但是,由于我的PK类有一个字段,该字段有一个@SequenceGenerator,每当我尝试插入到外键表中时,hibernate都会生成一个额外的序列,并且由于找不到父键而导致插入失败 由于@SequenceGenerator正在为后续插入到其他表
@SequenceGenerator
。因为列在表之间共享,所以我尝试让我的实体都使用相同的PK类。但是,由于我的PK类有一个字段,该字段有一个@SequenceGenerator
,每当我尝试插入到外键表中时,hibernate都会生成一个额外的序列,并且由于找不到父键而导致插入失败
由于@SequenceGenerator
正在为后续插入到其他表中生成一个附加序列,因此我为每个其他表克隆了我的PK类,并删除了@SequenceGenerator
,因此列是相同的,hibernate在插入期间不会生成新序列。然而,这又产生了另一个问题,hibernate期望的PK类与提供的PK类不同
public类AddrEntityPK实现可序列化{
@身份证
私人长地址;
@SequenceGenerator(name=“ADDR_SEQ”,sequenceName=“ADDR_SEQ”,allocationSize=1)
@生成值(generator=“ADDR_SEQ”)
私有长addrSeqNum;
}
公共类PhoneEntityPK实现可序列化{
@身份证
私人长地址;
@身份证
私有长addrSeqNum;
}
公共类ElecrMailEntityPK实现可序列化{
@身份证
私人长地址;
@身份证
私有长addrSeqNum;
}
@实体
@IdClass(AddrEntityPK.class)
公共类地址{}
@实体
@IdClass(PhoneEntityPK.class)
公共类PhoneEntity{}
@实体
@IdClass(ElecrMailEntityPK.class)
公共类ElecrMailEntity{}
由于列名相同,我希望hibernate不会生成异常,而是抛出
org.hibernate.typemischException:为类addrenty提供错误类型的id。预期的AddrEntityPK、Get类PhoneEntityPK
一般属性字段和方法与问题关系不大,但id字段和将实体相互关联的关系字段至关重要,特别是由于我不清楚实体名称或ID类的关系性质。因此,我怀疑最好的答案可能是从@IdClass
切换到@EmbeddedId
,并适当参与。后者是处理您描述的一般场景的机制,其中一个实体的标识全部或部分由与另一个实体的一对一关系定义。切换到@EmbeddedId
是使用@MapsId
的先决条件。@SequenceGenerator
和@GenerateValue
是否能在@EmbeddedId
内工作?我不确定。(如果我是的话,我会写一个答案而不是注释。)我怀疑用@Id
或@GeneratedValue
注释@embeddeble类中的字段是行不通的,但是你应该能够将这些注释放在主实体的字段上。您还应该能够使用@embeddedable
类作为主实体的@IdClass
(而不在那一侧嵌入)。因此,只需将@Id
和@GeneratedValue
移动到主实体就可以了。我甚至不需要将@embeddeble
注释添加到我的PK类中。谢谢你的帮助!一般属性字段和方法与问题关系不大,但id字段和将实体相互关联的关系字段非常重要,特别是因为从实体名称或id类来看,我不清楚关系的性质,我想最好的答案可能是从@IdClass
切换到@EmbeddedId
,并适当参与。后者是处理您描述的一般场景的机制,其中一个实体的标识全部或部分由与另一个实体的一对一关系定义。切换到@EmbeddedId
是使用@MapsId
的先决条件。@SequenceGenerator
和@GenerateValue
是否能在@EmbeddedId
内工作?我不确定。(如果我是的话,我会写一个答案而不是注释。)我怀疑用@Id
或@GeneratedValue
注释@embeddeble类中的字段是行不通的,但是你应该能够将这些注释放在主实体的字段上。您还应该能够使用@embeddedable
类作为主实体的@IdClass
(而不在那一侧嵌入)。因此,只需将@Id
和@GeneratedValue
移动到主实体就可以了。我甚至不需要将@embeddeble
注释添加到我的PK类中。谢谢你的帮助!