2009-03-23 11 views
3

Ich brauche 3 Entitäten: Benutzer, Vertrag (die eine Viele-zu-viele-Beziehung sind) und eine mittlere Entität: UserContract (dies wird benötigt, um einige Felder zu speichern).Wie mache ich eine Join-Tabelle in JPA?

Was ich wissen möchte, ist die korrekte Möglichkeit, die Beziehungen zwischen diesen Entitäten in JPA/EJB 3.0 zu definieren, so dass die Operationen (persist, delete, etc) in Ordnung sind.

Zum Beispiel möchte ich einen Benutzer und seine Verträge erstellen und sie auf einfache Weise beibehalten.

Zeit, was ich habe, ist dies: In User.java:

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

In Contract.java:

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

Und mein UserContract.java:

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

@ManyToOne(optional = false) 
private User user; 

@ManyToOne(optional = false) 
private Contract contract; 

Und Mein UserContractPK:

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

@Column(nullable = false) 
private String email; 

Ist dies der beste Weg, um meine Ziele zu erreichen?

Antwort

2

Alles sieht gut aus. Mein Rat ist, @MappedSuperclass oben auf @EmbeddedId zu verwenden:

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

} 

ich offensichtlich Konstrukteure/Setter für Lesbarkeit weggelassen. Dann können Sie UserContract als

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

auf diese Weise definieren Sie Primärschlüssel Implementierung für andere many-to-many verbinden Entitäten wie UserContract teilen können.