2011-12-20 38 views
10

Tengo una pregunta para diseñar ManyToMany en EJB, ¿cómo puede una propiedad de unión tener una propiedad?
Aquí hay un ejemplo, los estudiantes y los cursos son ManyToMany, cada estudiante tiene muchos cursos y muchos estudiantes eligen uno.JPA ManyToMany, ¿cómo puede JoinTable tener una propiedad?

@Entity 
    public class Student implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     Long id; 
     String name; 
     private Collection<Course> courses; 

     @ManyToMany(mappedBy = "students",cascade=CascadeType.ALL)  
     public Collection<Course> getCourses() { 
      return this.courses; 
     } 

     public void setCourses(Collection<Course> courses) { 
      this.courses = courses; 
     } 

    } 


    @Entity 
    public class Course implements Serializable { 
     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     Long id; 
     String name; 
     private Collection<Student> students; 

     @ManyToMany(cascade=CascadeType.ALL) 
     @JoinTable(name = "Student_Course", 
     joinColumns = {@JoinColumn(name = "Course_ID", referencedColumnName = "id")}, 
     inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "id")}) 

     public Collection<Student> getStudents() { 
      return this.students; 
     } 

     public void setStudents(Collection<Student> students) { 
      this.students = students; 
     } 
    } 

Sin embargo, si tengo una propiedad en el JoinTable, por ejemplo, cada estudiante tiene una calificación para un curso. ¿Cómo puedo hacerlo en EJB con ManyToMany?
¡Muchas gracias por su atención!

+1

Si su relación tiene la propiedad, entonces usted debe modelar como entidad. Esta pregunta es casi idéntica: http://stackoverflow.com/questions/7602386/mapping-value-in-junction-table-to-entity/7603036#7603036 Hasta el nombre de la entidad que representa la relación (CourseAssignment) se ajusta bastante bien a su caso. –

+3

No es posible, no puede agregar propiedad a la relación. Si necesita acceder a la propiedad en la tabla de unión, esa propiedad pertenece a alguna entidad y, como resultado, necesita una tercera entidad. –

+0

lo siento, lo corregí. Tengo otra pregunta, cuando utilicé una clase @Embeddable como PK para enlazar, no funciona (la compilación falló), ¡alguien dijo que JPA2.0 no es compatible! por favor, mira esto [jpa-eclipselink-manytomany-with-dat] (http://stackoverflow.com/questions/4013397/jpa-eclipselink-manytomany-with-data), ¿hay alguna forma de hacerlo funcionar? – seaguest

Respuesta

4

No es posible, no se puede añadir una propiedad a la relación. Si necesita acceder a la propiedad en la tabla de unión, esa propiedad pertenece a alguna entidad y, como resultado, necesita una tercera entidad.

3

Es posible.

Solo necesita reemplazar el mapeo de muchos a muchos con la combinación explícita de asignaciones uno a muchos y varios a uno a través de una tercera entidad, que representaría la asociación entre las dos entidades primarias (estudiante y por supuesto en tu ejemplo).

Por favor, lea los detalles here

0

entidades con relaciones muchos a muchos (Merchant y servicio). Esto se puede lograr mediante una tercera entidad de la siguiente manera: -

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

} 
Cuestiones relacionadas