如何在JPA中正确执行manytomany连接表?

时间:2009-03-23 22:44:52

标签: jpa java-ee ejb

我需要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;

这是实现目标的最佳方式吗?

1 个答案:

答案 0 :(得分:2)

一切看起来都很正确。我的建议是在@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;
   }

 }

为了便于阅读,我省略了明显的构造函数/ setter。然后,您可以将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)的主键实现。