Ответ 1
Это невозможно, вы не можете добавить свойство к отношениям. Если вам нужно получить доступ к свойству в таблице соединений, то это свойство принадлежит некоторому объекту, и в результате вам понадобится третий объект.
У меня есть вопрос для разработки 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?
Большое спасибо за внимание!
Это невозможно, вы не можете добавить свойство к отношениям. Если вам нужно получить доступ к свойству в таблице соединений, то это свойство принадлежит некоторому объекту, и в результате вам понадобится третий объект.
Возможно.
Вам просто нужно заменить сопоставление "многие-ко-многим" явной комбинацией сопоставлений "один-ко-многим" и "много-к-одному" с помощью третьего объекта, который будет представлять собой связь между двумя первичными объектами (студент и курс в вашем примере).
Пожалуйста, прочтите ниже здесь
Сущности с многими или многими отношениями (торговец и сервис). Это может быть достигнуто с использованием третьего объекта следующим образом: -
@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<>();
}