我在为某些实体设置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类,但是当一个字段是父类的外键时,我不确定该怎么做。一旦设置好,父级将如何引用子级实体?
任何帮助表示赞赏。
这受JPA 2规范的第2.4.1节“与派生身份相对应的主键” 约束。本节包含两个直接适用于您的问题的示例。
如规范中所述,在这种情况下,有两种方式表示子实体的密钥:
@IdClass
@EmbeddedId
这是一个大概的草图EmbeddedId。我选择EmbeddedId随意,但之间的选择IdClass和EmbeddedId是显著。您可以选择不同的方式。
EmbeddedId
IdClass
// 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”。我想就是这样,但是我之前从未使用过完全像这样的实体。可能错过了一些东西…如果发现错误,请发表。
userDetails
mappedBy