我需要3个实体:User,Contract(多对多关系)和一个中间实体:UserContract(需要存储一些字段)。
我想知道的是在JPA / EJB 3.0中定义这些实体之间关系的正确方法,这样操作(持久,删除等)就可以了。
例如,我想创建一个用户及其合同,并以一种简单的方式持久化它们。
目前我所拥有的是:
在User.java中:
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<UserContract> userContract;
在Contract.java中:
@OneToMany(mappedBy = "contract", fetch = FetchType.LAZY)
private Collection<UserContract> userContract;
还有我的UserContract.java:
@Entity
public class UserContract {
@EmbeddedId
private UserContractPK userContractPK;
@ManyToOne(optional = false)
private User user;
@ManyToOne(optional = false)
private Contract contract;
和我的UserContractPK:
@Embeddable
public class UserContractPK implements Serializable {
@Column(nullable = false)
private long idContract;
@Column(nullable = false)
private String email;
这是实现目标的最好方法吗?
最佳答案
一切看起来都正确。我的建议是在@MappedSuperclass
之上使用@EmbeddedId
:
@MappedSuperclass
public abstract class ModelBaseRelationship implements Serializable {
@Embeddable
public static class Id implements Serializable {
public Long entityId1;
public Long entityId2;
@Column(name = "ENTITY1_ID")
public Long getEntityId1() {
return entityId1;
}
@Column(name = "ENTITY2_ID")
public Long getEntityId2() {
return entityId2;
}
public Id() {
}
public Id(Long entityId1, Long entityId2) {
this.entityId1 = entityId1;
this.entityId2 = entityId2;
}
}
protected Id id = new Id();
@EmbeddedId
public Id getId() {
return id;
}
protected void setId(Id theId) {
id = theId;
}
}
为了简化可读性,我省略了明显的构造方法。然后,您可以将UserContract定义为
@Entity
@AttributeOverrides( {
@AttributeOverride(name = "entityId1", column = @Column(name = "user_id")),
@AttributeOverride(name = "entityId2", column = @Column(name = "contract_id"))
})
public class UserContract extends ModelBaseRelationship {
这样,您可以为其他多对多联接实体(如UserContract)共享主键实现。