2016-06-21 8 views
0

Ich habe einige Tabellen:ManyToMany: MappingException: Typ konnte nicht ermitteln für: java.util.List

PROFIL: id_profil, ...

EXPERIENCE: id_experience, id_profil #. ..

COMPETENCE_LEVEL: id_competence_level, Niveau, ...

One PROFIL kann viel ERFAHRUNG und Los COMPETENCE_LEVEL haben.

One EXPERIENCE kann viel COMPETENCE_LEVEL haben.

Ein COMPETENCE_LEVEL betrifft Los ERFAHRUNG.

Also, für mich, zwischen EXPERIENCE und COMPETENCE_LEVEL, ist dies eine (n-p) ManyToMany Beziehung.

Ich habe versucht:

PROFIL.java:

@Entity 
@Table(name="profil") 
public class Profil { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id_profil") 
    private Long idProfil; 

    public Profil() { 
     super(); 
    } 

    public Long getIdProfil() { 
     return idProfil; 
    } 

    public void setIdProfil(Long idProfil) { 
     this.idProfil = idProfil; 
    } 

    @Override 
    public String toString() { 
     //[...] 
    } 

} 

EXPERIENCE.java:

@Entity 
@Table(name="experience") 
public class Experience { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id_experience") 
    private Long idExperience; 

    @ManyToOne 
    @JoinColumn(name="id_profil") 
    private Profil idProfil; 

    private List<CompetenceLevel> competenceLevels; 

    public Experience() { 
     super(); 
     idProfil = new Profil(); 
    } 

    public Long getIdExperience() { 
     return idExperience; 
    } 

    public void setIdExperience(Long idExperience) { 
     this.idExperience = idExperience; 
    } 

    public Profil getIdProfil() { 
     return idProfil; 
    } 

    public void setIdProfil(Profil idProfil) { 
     this.idProfil = idProfil; 
    } 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "experience_competence_level", joinColumns = @JoinColumn(name = "id_experience", referencedColumnName = "id_experience"), inverseJoinColumns = @JoinColumn(name = "id_competence_level", referencedColumnName = "id_competence_level")) 
    public List<CompetenceLevel> getCompetenceLevels() { 
     return competenceLevels; 
    } 

    public void setCompetenceLevels(List<CompetenceLevel> competenceLevels) { 
     this.competenceLevels = competenceLevels; 
    } 

    @Override 
    public String toString() { 
     // [...] 
    } 

} 

COMPETENCE_LEVEL.java:

So
@Entity 
@Table(name="competence_level") 
public class CompetenceLevel { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name="id_competence_level") 
    private Long idCompetenceLevel; 

    @OneToOne 
    @JoinColumn(name="id_level") 
    private Level level; 

    @OneToOne 
    @JoinColumn(name="id_profil") 
    private Profil profil; 

    private List<Experience> experiences; 

    public CompetenceLevel() { 
     super(); 
    } 

    public Long getIdCompetenceLevel() { 
     return idCompetenceLevel; 
    } 

    public void setIdCompetenceLevel(Long idCompetenceLevel) { 
     this.idCompetenceLevel = idCompetenceLevel; 
    } 

    public Level getLevel() { 
     return level; 
    } 

    public void setLevel(Level level) { 
     this.level = level; 
    } 

    public Profil getProfil() { 
     return profil; 
    } 

    public void setProfil(Profil profil) { 
     this.profil = profil; 
    } 

    @ManyToMany(mappedBy = "competenceLevels") 
    public List<Experience> getExperiences() { 
     return experiences; 
    } 

    public void setExperiences(List<Experience> experiences) { 
     this.experiences = experiences; 
    } 

    @Override 
    public String toString() { 
     // [...] 
    } 

} 

, ich habe diesen Fehler:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: competence_level, for columns: [org.hibernate.mapping.Column(experiences)] 

Ich verstehe nicht, warum. Ich folge diesem tuto: https://hellokoding.com/jpa-many-to-many-relationship-mapping-example-with-spring-boot-maven-and-mysql/

Haben Sie eine Idee? Vielen Dank.

Antwort

2

Hibernate erzeugt hier einen unklaren Fehler. Es ist sehr schwierig, den Grund für den Fehler herauszufinden, wenn Sie es vorher nicht bemerken.

Der Grund ist einfach: Mischen Sie nicht Feld und Methode Anmerkungen in der gleichen persistenten Klasse.

+0

Ok Dank nicht schreiben :) es funktioniert. Ich schreibe die Anmerkungen zu den Feldern :). Jetzt habe ich Probleme mit Stakoverflow-Ausnahme. Wenn ich die Liste der Erfahrungen in CompetenceLevel entferne, funktioniert es:/Aber ich brauche es, hast du eine Idee? thx – Paladice

+0

@Paladice Vielen Dank für eine schnelle Annahme. Ich denke, es wird besser, wenn Sie eine andere Frage stellen. Und fügen Sie einfach Entitäten hinzu - die Beschreibung der Tabellen in der Kopfzeile der Frage ist schwer zu lesen. –

+0

Ok danke :) Ich werde es tun. – Paladice

3

In Ihrem Code mischen Sie Feldzugriff und Eigenschaftenzugriff. Siehe this answer.

Ich würde lieber nur eine der Möglichkeiten nutzen. Ich verwende Feldkommentare, wie Sie es für idProfil getan haben.

In dem Buch "Professional Java für Web-Anwendungen" von Nicholas S.Williams (sehr, sehr gut) Ich fand dies:

Sie sollten nie JPA Eigenschaft Anmerkungen und JPA Feld Anmerkungen in derselben Einheit mischen. Dies führt zu unspezifizierten Verhalten und ist sehr wahrscheinlich zu Fehlern führen.

Und nur für Klarheit, ich würde den

@ManyToOne 
@JoinColumn(name="id_profil") 
private Profil idProfil; 
// better: 
// private Profil profil; 
Verwandte Themen