2009-03-23 10 views
3

私は3つのエンティティ:ユーザ、契約(多対多の関係)、中間エンティティ:UserContract(これはいくつかのフィールドを格納するために必要です)が必要です。JPAでmanytomany結合テーブルを正しく行うにはどうすればいいですか?

私が知りたいのは、JPA/EJB 3.0のこれらのエンティティ間の関係を定義して、操作(永続性、削除など)がOKであることです。

たとえば、ユーザーとその契約を作成し、簡単な方法で永続化したいと考えています。

は、現在、私が持っているものである。この:User.javaで :

Contract.javaで
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY) 
    private List<UserContract> userContract; 

@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; 

これは私の目標を達成する最善の方法ですか?

答えて

2

すべてが正しく表示されます。私のアドバイスは、@EmbeddedIdの上に@MappedSuperclassを使用することです:

@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のような他の多対多の結合エンティティに対して主キーの実装を共有できます。

関連する問題