2011-12-20 2 views
10

J'ai une question pour la conception du ManyToMany dans EJB, comment un jointable peut-il avoir une propriété?
Voici un exemple, les étudiants et les cours sont ManyToMany, chaque étudiant a beaucoup de cours, et beaucoup d'étudiants choisissent un cours. Toutefois, si j'ai une propriété dans le JoinTable, par exemple, chaque étudiant a un score pour un cours. Comment puis-je faire en EJB avec ManyToMany?
Un grand merci pour votre attention!
JPA ManyToMany, comment JoinTable peut-il avoir une propriété?

+1

Si votre relation a la propriété, alors vous devriez le modèle comme entité. Cette question est presque identique: http://stackoverflow.com/questions/7602386/mapping-value-in-junction-table-to-entity/7603036#7603036 Même le nom de l'entité représentant la relation (CourseAssignment) correspond assez bien à votre Cas. –

+3

Ce n'est pas possible, vous ne pouvez pas ajouter de propriété à la relation. Si vous devez accéder à la propriété dans la table de jointure, cette propriété appartient à une entité et, par conséquent, vous avez besoin d'une entité tierce. –

+0

désolé, j'ai corrigé cela. J'ai juste une autre question, quand j'ai utilisé une classe @Embeddable comme PK pour jointable, ça ne marche pas (compilation échouée), quelqu'un a dit que JPA2.0 ne supporte pas ça! S'il vous plaît regardez cela [jpa-eclipselink-manytomany-with-dat] (http://stackoverflow.com/questions/4013397/jpa-eclipselink-manytomany-with-data), est-il possible de le faire fonctionner? – seaguest

Répondre

4

Ce n'est pas possible, vous ne pouvez pas ajouter de propriété à la relation. Si vous devez accéder à la propriété dans la table de jointure, cette propriété appartient à une entité et, par conséquent, vous avez besoin d'une entité tierce.

3

C'est possible.

Vous avez juste besoin de remplacer le mappage plusieurs-à-plusieurs par la combinaison explicite de mappages un-à-plusieurs et plusieurs-à-un via une troisième entité, qui représenterait l'association entre les deux entités principales bien sûr dans votre exemple).

S'il vous plaît lire les détails here

0

Entités avec beaucoup de nombreuses relations (commerçants et services). Ceci peut être réalisé en utilisant une troisième entité comme suit: -

@Entity 
@Table(name = "merchant") 
public class Merchant implements java.io.Serializable { 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.merchant",targetEntity = MerchantService.class) 
    private Set<MerchantService> merchantServices = new HashSet<>(); 
} 

@Entity 
@Table(name = "merchant_service") 
@AssociationOverrides({ 
     @AssociationOverride(name = "pk.merchant", 
      joinColumns = @JoinColumn(name = "merchant_id")), 
     @AssociationOverride(name = "pk.service", 
      joinColumns = @JoinColumn(name = "service_id")) }) 
public class MerchantService implements java.io.Serializable { 

    @EmbeddedId 
    private MerchantServiceId pk = new MerchantServiceId(); 

    private boolean isActive; 

    public MerchantServiceId getPk() { 
     return pk; 
    } 

    public void setPk(MerchantServiceId pk) { 
     this.pk = pk; 
    } 

    @Transient 
    public Service getService() { 
     return getPk().getService(); 
    } 


    @Transient 
    public Merchant getMerchant() { 
     return getPk().getMerchant(); 
    } 


    public boolean isActive() { 
     return isActive; 
    } 

    public void setActive(boolean isActive) { 
     this.isActive = isActive; 
    } 

} 

@Embeddable 
public class MerchantServiceId implements java.io.Serializable { 

    private Merchant merchant; 
    private Service service; 

    @ManyToOne 
    public Merchant getMerchant() { 
     return merchant; 
    } 

    @ManyToOne 
    public Service getService() { 
     return service; 
    } 

} 

@Entity 
@Table(name = "service") 
public class Service implements java.io.Serializable { 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.service",targetEntity = MerchantService.class) 
    private Set<MerchantService> merchantServices = new HashSet<>(); 

} 
Questions connexes