Java jpa hibernate复合外键映射
我在为某些实体设置jpa映射时遇到问题。我有一个定义如下的父实体Java jpa hibernate复合外键映射,java,hibernate,jpa,Java,Hibernate,Jpa,我在为某些实体设置jpa映射时遇到问题。我有一个定义如下的父实体 @实体 @表(name=“EIF\U实例\U HDR”) 公共类InstanceEntity实现可序列化{ 私有静态最终长serialVersionUID=1L; @身份证 @生成值(generator=“eif_inst_gen”) @SequenceGenerator(name=“eif_inst_gen”,sequenceName=“eif_INSTANCE_SEQ”) @列(name=“EAIH\u ID”) 私人长eai
@实体
@表(name=“EIF\U实例\U HDR”)
公共类InstanceEntity实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@生成值(generator=“eif_inst_gen”)
@SequenceGenerator(name=“eif_inst_gen”,sequenceName=“eif_INSTANCE_SEQ”)
@列(name=“EAIH\u ID”)
私人长eaihid;
@列(name=“EAD_ID”)
私人长标题;
@OneToMany(targetEntity=InstanceNotifyEntity.class,mappedBy=“instance”,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List userDetails=new ArrayList();
}
然后,我有一个子实体和一个复合键,该表的主键有一个外键,如下所示:
@实体
@表(name=“EIF_INST_NOTIFIED”)
公共类InstanceNotifyEntity实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@许多酮
@JoinColumn(name=“EAIH\u ID”,referencedColumnName=“EAIH\u ID”)
私有实例实体实例;
@身份证
@列(name=“USER\u ID”)
私有长用户ID;
@列(name=“COMMENT\u TXT”)
私有字符串注释文本;
}
我知道子实体不正确,但我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但当一个字段是父类的外键时,我不确定如何设置。一旦设置完成,父实体将如何引用子实体
非常感谢您的帮助。这受第2.4.1节“与派生身份对应的主键”的约束。本节包含两个直接适用于您的问题的示例
如规范中所述,在这种情况下,有两种方式表示子实体的键:
@IdClass
@EmbeddedId
EmbeddedId
方式的大致示意图。我随意选择了EmbeddedId
,但是IdClass
和EmbeddedId
之间的选择是非常重要的。你可能会做出不同的选择
// Child entity's composite primary key
@Embeddable
public class InstanceNotifyEntityId implements Serializable {
Long eaihId;
Long userId;
}
// Child entity
@Entity
@Table(name="EIF_INST_NOTIFIED")
public class InstanceNotifyEntity implements Serializable {
@AttributeOverrides({
@AttributeOverride(name="userId", column = @Column(name="USER_ID"))
@AttributeOverride(name="eaihId", column = @Column(name="EAIH_ID"))
})
@EmbeddedId
InstanceNotifyEntityId id;
@MapsId("eaihId")
@ManyToOne
InstanceEntity instance;
// ...
}
父实体需要一个更改:
userDetails
属性mappedBy
应该是“id.eaihId”。我想就是这样,但我以前从未使用过像这样的实体。可能错过了什么。。。如果您看到错误,请发布。我也面临同样的问题,并遵循此答案,但它没有将子实体与父实体一起保存。这是我所做的修改,效果很好。作出以下更改—
// Child entity's composite primary key class
public class InstanceNotifyEntityId implements Serializable {
@Column(name = "USER_ID")
Long userId;
@JoinColumn(name = "EAIH_ID")
@ManyToOne
InstanceEntity instance
}
// Child entity which contain composite primary key as a EmbeddedId,
// no need to define any relationship here as we already define
// the relationship in composite key class.
@Entity
@Table(name = "EIF_INST_NOTIFIED")
public class InstanceNotifyEntity implements Serializable {
@EmbeddedId
InstanceNotifyEntityId id;
}
// Parent entity (parent entity mappedby should be your composite
// key class instance.child class object which already have the
// join column mapping with "EAID_ID")
@Entity
@Table(name = "EIF_INSTANCE_HDR")
public class InstanceEntity implements Serializable {
@OneToMany(mappedBy = "id.instance,fetch=FetchType.EAGER, cascade = CascadeType.ALL)
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>();
}
//子实体的复合主键类
公共类InstanceNotifyEntityId实现可序列化{
@列(name=“USER\u ID”)
长用户标识;
@JoinColumn(name=“EAIH_ID”)
@许多酮
实例实体实例
}
//包含复合主键作为嵌入ID的子实体,
//这里不需要像我们已经定义的那样定义任何关系
//复合键类中的关系。
@实体
@表(name=“EIF_INST_NOTIFIED”)
公共类InstanceNotifyEntity实现可序列化{
@嵌入ID
InstanceNotifyEntityId;
}
//父实体(父实体mappedby应该是您的组合
//已具有
//将列映射与“EAID\U ID”连接起来
@实体
@表(name=“EIF\U实例\U HDR”)
公共类InstanceEntity实现可序列化{
@OneToMany(mappedBy=“id.instance,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
private List userDetails=new ArrayList();
}
保存父实体时,将父对象设置为复合键,如
id.setInstance(父对象整个obj)
请参阅,谢谢,这在很大程度上是有效的。不幸的是,我没有使用jpa 2.0,因此@MapsId注释不可用。我通过从父实体userDetails对象中删除级联关系来进行插入。因此,我需要在持久化父元素后插入每个子元素,但这是可行的目前我被要求使用jboss 4.2.3,我的理解是jpa 2.0在这个应用服务器上不起作用,至少在不交换大量库的情况下是不行的。