Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate中处理数据库中共享相同复合id的多个表实体?_Java_Oracle_Hibernate_Jpa_Composite Primary Key - Fatal编程技术网

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

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正在为后续插入到其他表

我的主表有一个复合主键,其中一个字段是序列。它与另外两个表有一对一的关系,其中复合键是这些表的主键/外键。在我的java代码中,我有一个PK类,它包含一个
@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类中。谢谢你的帮助!