Java jpa hibernate复合外键映射

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

我在为某些实体设置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”)
私人长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在这个应用服务器上不起作用,至少在不交换大量库的情况下是不行的。