2011-12-20 4 views
10

У меня есть вопрос для проектирования ManyToMany в EJB, как у совместимого есть свойство?
Вот пример, студенты и курсы ManyToMany, каждый студент имеет много курсов, и многие студенты выбирают один курс.JPA ManyToMany, как может JoinTable иметь свойство?

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

Однако, если у меня есть свойство в JoinTable, например, у каждого учащегося есть один балл за один курс. Как я могу сделать это в EJB с помощью ManyToMany?
Большое спасибо за внимание!

+1

Если ваше отношение имеют свойство, то вы должны моделировать его как целое. Этот вопрос почти идентичен: http://stackoverflow.com/questions/7602386/mapping-value-in-junction-table-toentent/7603036#7603036 Даже имя объекта, представляющего отношение (CourseAssignment), подходит для вашего дело. –

+3

Невозможно, вы не можете добавить свойство к отношениям. Если вам нужно получить доступ к свойству в таблице соединений, то это свойство принадлежит некоторому объекту, и в результате вам понадобится третий объект. –

+0

Извините, я исправил это. У меня есть еще один вопрос, когда я использовал класс @Embeddable как PK для совместного использования, он не работает (компиляция не удалась), кто-то сказал, что JPA2.0 этого не поддерживает! пожалуйста, посмотрите на это [jpa-eclipselink-manytomany-with-dat] (http://stackoverflow.com/questions/4013397/jpa-eclipselink-manytomany-with-data), есть ли способ заставить его работать? – seaguest

ответ

4

Невозможно, вы не можете добавить собственность к отношениям. Если вам нужно получить доступ к свойству в таблице соединений, то это свойство принадлежит некоторому объекту, и в результате вам понадобится третий объект.

3

Это возможно.

Вам просто нужно заменить отображение «много-во-множитель» явной комбинацией сопоставлений «один-ко-многим» и «много-к-одному» через 3-й объект, который будет представлять связь между двумя первичными объектами (учащимися и курс в вашем примере).

Пожалуйста, прочитайте подробности here

0

лица, имеющие многие ко многим отношений (торговли и обслуживания). Это может быть достигнуто с помощью третьего лица следующим образом: -

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

} 
Смежные вопросы