一尘不染

jpa hibernate复合外键映射

hibernate

我在为某些实体设置jpa映射时遇到麻烦。我有一个如下定义的父实体。

@Entity
@Table(name="EIF_INSTANCE_HDR")
public class InstanceEntity implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(generator="eif_inst_gen")
@SequenceGenerator(name="eif_inst_gen",sequenceName="EIF_INSTANCE_SEQ")
@Column(name = "EAIH_ID")
private Long eaihid;
@Column(name = "EAD_ID")
private Long eadid;

@OneToMany(targetEntity=InstanceNotifyEntity.class, mappedBy="instance",fetch=FetchType.EAGER, cascade = CascadeType.ALL)
private List<InstanceNotifyEntity> userDetails = new ArrayList<InstanceNotifyEntity>();
}

然后,我有一个带有复合键的子实体,以及此表的主键的外键,如下所示:

@Entity
@Table(name="EIF_INST_NOTIFIED")
public class InstanceNotifyEntity implements Serializable{

private static final long serialVersionUID = 1L;

@Id
@ManyToOne
@JoinColumn(name="EAIH_ID", referencedColumnName="EAIH_ID")
private InstanceEntity instance;

@Id
@Column(name="USER_ID")
private Long userId;
@Column(name="COMMENT_TXT")
private String commentText;
}

我知道子实体不正确,但是我不确定如何将其设置为具有复合PK。我知道我需要设置一个PK类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体?

任何帮助表示赞赏。


阅读 271

收藏
2020-06-20

共1个答案

一尘不染

这受JPA
2规范的
第2.4.1节“与派生身份相对应的主键”
约束。本节包含两个直接适用于您的问题的示例。

如规范中所述,在这种情况下,有两种方式表示子实体的密钥:

  • @IdClass
  • @EmbeddedId

这是一个大概的草图EmbeddedId。我选择EmbeddedId随意,但之间的选择IdClassEmbeddedId是显著。您可以选择不同的方式。

// 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”。我想就是这样,但是我之前从未使用过完全像这样的实体。可能错过了一些东西…如果发现错误,请发表。

2020-06-20