2009-03-23 4 views
3

J'ai besoin de 3 entités: Utilisateur, Contrat (qui sont une relation de plusieurs à plusieurs) et une entité intermédiaire: UserContract (ceci est nécessaire pour stocker certains champs).Comment faire correctement une table de jointure manytomany dans JPA?

Ce que je veux savoir est la bonne façon de définir les relations entre ces entités JPA/EJB 3.0 afin que les opérations (persistent, supprimer, etc.) sont OK.

Par exemple, je veux créer un utilisateur et ses contrats et les persistent d'une manière facile.

Actuellement ce que j'ai est la suivante: En User.java:

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

En Contract.java:

@OneToMany(mappedBy = "contract", fetch = FetchType.LAZY) 
private Collection<UserContract> userContract; 

Et mon UserContract.java:

@Entity 
public class UserContract { 
@EmbeddedId 
private UserContractPK userContractPK; 

@ManyToOne(optional = false) 
private User user; 

@ManyToOne(optional = false) 
private Contract contract; 

Et mon UserContractPK:

@Embeddable 
public class UserContractPK implements Serializable { 
@Column(nullable = false) 
private long idContract; 

@Column(nullable = false) 
private String email; 

Est-ce la meilleure façon d'atteindre mes objectifs?

Répondre

2

Tout va bien. Mon conseil est d'utiliser @MappedSuperclass au-dessus de @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; 
    } 

} 

I/constructeurs évidents omis setters pour une meilleure lisibilité. Vous pouvez ensuite définir UserContract comme

@Entity 
@AttributeOverrides({ 
     @AttributeOverride(name = "entityId1", column = @Column(name = "user_id")), 
     @AttributeOverride(name = "entityId2", column = @Column(name = "contract_id")) 
}) 
public class UserContract extends ModelBaseRelationship { 

De cette façon, vous pouvez partager l'implémentation de la clé primaire pour d'autres entités de jointure plusieurs à plusieurs comme UserContract.

Questions connexes