ManyToMany:MappingException:无法确定:java.util.List的类型

ManyToMany:MappingException:无法确定:java.util.List的类型,java,hibernate,many-to-many,Java,Hibernate,Many To Many,我有一些桌子: profile:id_profile 经验:身份证经验,身份证档案 能力水平:识别能力水平,水平 一个PROFIL可以有很多经验和很多能力水平 一个经验可以有很多能力水平 一个能力水平涉及大量的经验 因此,对我来说,在经验和能力水平之间,这是一种(n-p)manytomy关系 我试过: PROFIL.java: @Entity @Table(name="profil") public class Profil { @Id @GeneratedValue(stra

我有一些桌子:

profile:id_profile

经验:身份证经验,身份证档案

能力水平:识别能力水平,水平

一个PROFIL可以有很多经验和很多能力水平

一个经验可以有很多能力水平

一个能力水平涉及大量的经验

因此,对我来说,在经验和能力水平之间,这是一种(n-p)
manytomy
关系

我试过:

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

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

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

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

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

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

}
我不明白为什么。我跟着这首芭蕾舞曲:


你有什么想法吗?谢谢。

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


Hibernate在这里生成一个不清楚的错误。如果您以前不面对错误,就很难找出错误的原因。

在代码中,您混合了字段访问和属性访问。看

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

在Nicholas S.Williams(非常非常好)的《Web应用程序的专业Java》一书中,我发现:

绝不能将JPA属性注释和JPA字段混用 同一实体中的注释。这样做会导致未指定的 行为,很可能导致错误。

为了清楚起见,我不会写这个

@ManyToOne
@JoinColumn(name=“id\u profile”)
私人财产;
//更好:
//私有Profil Profil;

好的,谢谢:)它可以工作。我在字段()上写注释。现在,我有一个stakoverflow异常的问题。如果我删除CompetencyLevel中的经验列表,它会起作用:/但我需要它,你有什么想法吗?thx@Paladice谢谢你的快速接受。我想,如果你再问一个问题会更好。只需添加实体——问题标题中表格的描述很难阅读。