2016-06-21 40 views
0

我有一些表:多对多:MappingException:无法确定类型:java.util.List的

PROFIL:id_profil,...

经验:id_experience,id_profil#,。 ..

COMPETENCE_LEVEL:id_competence_level,水平,...

一个PROFIL可以有很多EXPERIENCE和很多COMPETENCE_LEVEL

一个经验可以有很多COMPETENCE_LEVEL

一个COMPETENCE_LEVEL担心很多经验

因此,对于我来说,在EXPERIENCE和COMPETENCE_LEVEL之间,这是一个(n-p)ManyToMany的关系。

我想:

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:

@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() { 
     // [...] 
    } 

} 

所以,我有这样的错误:

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

我不明白为什么。我按照这个tuto:https://hellokoding.com/jpa-many-to-many-relationship-mapping-example-with-spring-boot-maven-and-mysql/

你有什么想法吗?谢谢。

回答

2

Hibernate在这里产生一个不明确的错误。如果你以前没有面对过这个问题,很难弄清楚错误的原因。

原因很简单:不要在同一个持久类中混合字段和方法注释。

+0

好,谢谢。我在字段上写下注释:)。现在,我遇到了stakoverflow异常的问题。如果我删除了CompetenceLevel的经验列表,它可以工作:/但我需要它,你有一个想法吗? thx – Paladice

+0

@Paladice感谢您的快速接受。我想,如果你问另外一个问题,情况会好一些。只需添加实体 - 问题标题中表格的描述很难阅读。 –

+0

好的谢谢:)我会去做的。 – Paladice

3

在你的代码中,你正在混合字段访问和属性访问。见this answer

我宁愿只使用其中一种可能性。我使用字段注释,就像您为idProfil所做的那样。

在Nicholas S.的书“专业Java for Web应用程序”威廉姆斯(非常,非常好),我发现这一点:

你不应该在同一个实体 注解混合JPA财产注解和JPA领域。这样做的结果未指定 行为并很可能导致错误。

而只是为了清楚,:)它的工作,我不会写这篇

@ManyToOne 
@JoinColumn(name="id_profil") 
private Profil idProfil; 
// better: 
// private Profil profil; 
相关问题