JPA ManyToMany, как JoinTable может иметь свойство? - PullRequest
10 голосов
/ 21 декабря 2011

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

    @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?
Большое спасибо за ваше внимание!

Ответы [ 3 ]

4 голосов
/ 12 ноября 2014

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

3 голосов
/ 10 июня 2015

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

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

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

0 голосов
/ 08 ноября 2016

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

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

}
...