Вы должны использовать аннотацию @EmbeddedId
.
Пожалуйста, измените свой класс EcranChampId
на этот:
@Embeddable
public class EcranChampId implements Serializable {
@ManyToOne
private Champ champ;
@ManyToOne
private Ecran ecran;
//getters and setters
}
И измените свой класс EcranChamp
на этот:
@Entity
@Table(name = "champ_has_ecran_table_name")
@AssociationOverrides({
@AssociationOverride(name = "pk.champ", joinColumns = @JoinColumn(name = "champ_id"))
@AssociationOverride(name = "pk.ecran", joinColumns = @JoinColumn(name = "ecran_id"))
})
public class EcranChamp {
@EmbeddedId
private EcranChampId pk;
public EcranChamp() {
pk = new EcranChampId();
}
public EcranChampId getPk() {
return pk;
}
public void setPk(EcranChampId pk) {
this.pk = pk;
}
@Transient
public Champ getChamp() {
return pk.getChamp();
}
public void setChamp(Champ champ) {
pk.setChamp(champ);
}
@Transient
public Ecran getEcran() {
return pk.getEcran();
}
public void setChamp(Ecran ecran) {
pk.setEcran(ecran);
}
}
И используйте его так:
public class Champ {
@OneToMany(mappedBy = "pk.champ")
private Collection<EcranChamp> ecranChamps;
//getters and setters
}
Кроме того, если EcranChamp
или EcranChampId
не имеет других полей, я рекомендую вам использовать @ManyToMany
аннотацию вместо EcranChamp
classкак это:
public class Champ {
@ManyToMany
@JoinTable(
name = "champ_has_ecran_table_name",
joinColumns = @JoinColumn(name = "champ_id", referencedColumnName = "id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "ecran_id", referencedColumnName = "id", nullable = false)
)
private Collection<Ecran> ecrans;
//getters and setters
}