2014-12-09 2 views
0

У меня проблема с ассоциациями JPA и ManyToMany.У внешнего ключа есть неправильное количество столбцов

У меня есть два класса FOA_PARAM_EMPLOYE и FOA_PARAM_POSITION и таблица ассоциаций FOA_PARAM_EMPLOYE_POSITION.

Класс FoaParamEmploye:

@Entity 
@Table(name = "FOA_PARAM_EMPLOYE") 
@NamedQuery(name = "FoaParamEmploye.findAll", query = "SELECT f FROM FoaParamEmploye f") 
public class FoaParamEmploye implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private FoaParamEmployePK id; 

@Column(name = "ACTEUR_MAJ_OCCUR") 
private String acteurMajOccur; 

@Column(name = "ADRESSE_EMAIL") 
private String adresseEmail; 

// bi-directional many-to-many association to FoaParamPosition 
@ManyToMany 
@JoinTable(
     name = "FOA_PARAM_EMPLOYE_POSITION", 
     joinColumns = { @JoinColumn(name = "ID_EMPLOYE"), 
         @JoinColumn(name = "COD_ENTREP") }, 
     inverseJoinColumns = { @JoinColumn(name = "ID_POSITION") 
}) 
private List<FoaParamPosition> foaParamPositions; 

public FoaParamEmployePK getId() { 
    return this.id; 
} 

public void setId(FoaParamEmployePK id) { 
    this.id = id; 
} 

public String getActeurMajOccur() { 
    return this.acteurMajOccur; 
} 

public void setActeurMajOccur(String acteurMajOccur) { 
    this.acteurMajOccur = acteurMajOccur; 
} 

public String getAdresseEmail() { 
    return this.adresseEmail; 
} 

public void setAdresseEmail(String adresseEmail) { 
    this.adresseEmail = adresseEmail; 
} 

public List<FoaParamPosition> getFoaParamPositions() { 
    return foaParamPositions; 
} 

public void setFoaParamPositions(List<FoaParamPosition> pFoaParamPositions) { 
    this.foaParamPositions = pFoaParamPositions; 
} 
} 

Класс FoaParamPosition:

@Entity 
@Table(name="FOA_PARAM_POSITION") 
@NamedQuery(name="FoaParamPosition.findAll", query="SELECT f FROM FoaParamPosition f") 
public class FoaParamPosition implements Serializable { 
private static final long serialVersionUID = 1L; 

@EmbeddedId 
private FoaParamPositionPK id; 

@Column(name="ACTEUR_MAJ_OCCUR") 
private String acteurMajOccur; 

@Column(name="CD_PROFIL_AFFECTATION") 
private String cdProfilAffectation; 

// bi-directional many-to-many association to FoaParamEmploye 
@ManyToMany 
private List<FoaParamEmploye> foaParamEmployes; 

public FoaParamPositionPK getId() { 
    return this.id; 
} 

public void setId(FoaParamPositionPK id) { 
    this.id = id; 
} 

public String getActeurMajOccur() { 
    return this.acteurMajOccur; 
} 

public void setActeurMajOccur(String acteurMajOccur) { 
    this.acteurMajOccur = acteurMajOccur; 
} 

public String getCdProfilAffectation() { 
    return this.cdProfilAffectation; 
} 

public void setCdProfilAffectation(String cdProfilAffectation) { 
    this.cdProfilAffectation = cdProfilAffectation; 
} 

public List<FoaParamEmploye> getFoaParamEmployes() { 
    return foaParamEmployes; 
} 

public void setFoaParamEmployes(List<FoaParamEmploye> pFoaParamEmployes) { 
    this.foaParamEmployes = pFoaParamEmployes; 
} 
} 

Таблица FOA_PARAM_EMPLOYE_POSITION имеет эти столбцы:

COD_ENTREP 
ID_EMPLOYE 
ID_POSITION 
XQCIF 
ACTEUR_MAJ_OCCUR 
DATE_HEURE_MAJ_OCCUR 

я получил это исключение:

A Foreign key refering com.groupama.middlgan.entities.FoaParamPosition from 
com.groupama.middlgan.entities.FoaParamEmploye has the wrong number of column. 
should be 2 

Если добавить COD_ENTREP на inverseJoinColumns в моем FoaParamEmploye сущности, я получил это исключение:

Repeated column in mapping for collection: 
com.groupama.middlgan.entities.FoaParamEmploye.foaParamPositions column: COD_ENTREP 

Любой навязчивой?

ответ

0

[Я предполагаю, что вы перечисляете столбцы для таблицы ассоциации FOA_PARAM_EMPLOYE_POSITION, не FOA_PARAM_EMPLOYE, как Вы заявляете в вашем вопросе.]

Ваших отображений подразумевают FOA_PARAM_EMPLOYE_POSITION.COD_ENTREP является частью два внешних ключей, один ссылающегося FOA_PARAM_EMPLOYE и один ссылка FOA_PARAM_POSITION. На практике эти два внешних ключа могут содержать одно и то же значение для COD_ENTREP, но это не может быть обеспечено базой данных или JPA.

Вы, вероятно, следует моделировать отношения по-другому, возможно, добавить еще один, контейнер типа, объект, который имеет двунаправленную отношения один-ко-многим с обеих FoaParamEmploye и FoaParamPosition и акции части первичного ключа с двумя другими первичными ключами ,

+0

Я нахожу решение, удаляя inverseJoinColumns в FoaParamEmploye и добавляя @JoinTable в FoaParamPosition (без inverseJoinColumns тоже). – user3469203

0

Если вы хотите сохранить inverseJoinColumn отображение можно сделать следующий образом,

@ManyToMany 
@JoinTable(
    name = "FOA_PARAM_EMPLOYE_POSITION", 
    joinColumns = { @JoinColumn(name = "ID_EMPLOYE"), 
        @JoinColumn(name = "COD_ENTREP") } 
, 
     inverseJoinColumns = {@JoinColumn(name = "FOAPARAMPOSITION_COD_ENTREP"), @JoinColumn(name = "FOAPARAMPOSITION_ID_POSITION")} 
) 
private List<FoaParamPosition> foaParamPosition; 

и

@ManyToMany 
@JoinTable(
    name = "FOA_PARAM_EMPLOYE_POSITION", 
    joinColumns = { @JoinColumn(name = "ID_POSITION"), 
        @JoinColumn(name = "COD_ENTREP") } 
     , 
     inverseJoinColumns = {@JoinColumn(name = "FOAPARAMEMPLOYE_COD_ENTREP"), @JoinColumn(name = "FOAPARAMEMPLOYE_ID_EMPLOYE")} 

) 
private List<FoaParamEmploye> foaParamEmploye; 

отображение выровнено с кодом вы публикуемым в вашем другом вопросе JPA Many To Many Select

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