Java 如何在多对多关系中保留额外的列(属性)?

Java 如何在多对多关系中保留额外的列(属性)?,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我在使用jpa和hibernate实现多对多关系中的额外列时遇到了一些困难 我已经试过很多次了,但没有成功。我工作的唯一方法是使用简单的多对多关系,没有额外的列,也没有创建新的实体。我在下面给出的代码是有效的,但它没有包含所需的额外实体,称为“CandidateLanguage”,因此我可以添加一个额外的属性 //CANDIDATE CLASS //imports @Entity @Table(name="candidates") @EntityListeners(AuditingEntityL

我在使用jpa和hibernate实现多对多关系中的额外列时遇到了一些困难

我已经试过很多次了,但没有成功。我工作的唯一方法是使用简单的多对多关系,没有额外的列,也没有创建新的实体。我在下面给出的代码是有效的,但它没有包含所需的额外实体,称为“CandidateLanguage”,因此我可以添加一个额外的属性

//CANDIDATE CLASS
//imports
@Entity
@Table(name="candidates")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdat", "updatedat"}, allowGetters =
true)
public class Candidate {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
private String fullname;
private String address;
private String birthdate;
private String placeofbirth;
private String hobbies;
private String presentation;    
private int yearsofexperience;

@Column(nullable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
private Date createdat;

@Column(nullable =false)
@Temporal(TemporalType.TIMESTAMP)
@LastModifiedDate
private Date updatedat;



public Candidate(String fullname, String address, String birthdate, String placeofbirth, String hobbies, String presentation, int yearsofexperience) {
    this.fullname = fullname;
    this.address = address;
    this.birthdate = birthdate;
    this.placeofbirth = placeofbirth;
    this.hobbies = hobbies;
    this.presentation = presentation;
    this.yearsofexperience = yearsofexperience;
}


@ManyToMany(fetch = FetchType.EAGER,
        cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
        })
@JoinTable(name = "candidate_languages",
        joinColumns = { @JoinColumn(name = "candidate_id") },
        inverseJoinColumns = { @JoinColumn(name = "language_id") })
private Set<Language> languages = new HashSet<>();

//getters and setters



//LANGUAGE CLASS
//imports
@Entity
@Table(name="languages")
@EntityListeners(AuditingEntityListener.class)
public class Language {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@NaturalId
private String idiom;

@ManyToMany(fetch = FetchType.EAGER,
        cascade = {
                CascadeType.PERSIST,
                CascadeType.MERGE
},
        mappedBy = "languages")
private Set<Candidate> candidates = new HashSet<>();

public Language() {

}

public Language(String idiom) {
    this.idiom = idiom;
}
//getters and setters
//候选类
//进口
@实体
@表(name=“候选人”)
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(值={“createdat”,“updatedat”},allowGetters=
(对)
公开课候选人{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串全名;
私有字符串地址;
私人字符串生日;
出生的私人字符串;
私人爱好;
私有字符串表示;
私人经验;
@列(nullable=false,Updateable=false)
@时态(TemporalType.TIMESTAMP)
@创建数据
私人日期创建日期;
@列(nullable=false)
@时态(TemporalType.TIMESTAMP)
@最后修改日期
私人日期更新日期;
公开候选人(字符串全名、字符串地址、字符串出生日期、字符串出生地点、字符串爱好、字符串演示、整数年经验){
this.fullname=fullname;
this.address=地址;
this.birthdate=生日;
this.placeofbirth=出生地点;
这个。爱好=爱好;
这个演示文稿=演示文稿;
this.yearsof experience=yearsof experience;
}
@ManyToMany(fetch=FetchType.EAGER,
级联={
cascade type.PERSIST,
级联类型合并
})
@JoinTable(name=“候选语言”,
joinColumns={@JoinColumn(name=“candidate_id”)},
inverseJoinColumns={@JoinColumn(name=“language_id”)})
私有集语言=新HashSet();
//接球手和接球手
//语言课
//进口
@实体
@表(name=“语言”)
@EntityListeners(AuditingEntityListener.class)
公共类语言{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@归化
私有字符串习语;
@ManyToMany(fetch=FetchType.EAGER,
级联={
cascade type.PERSIST,
级联类型合并
},
mappedBy=“语言”)
私有集候选者=新HashSet();
公共语言(){
}
公共语言(字符串习语){
这个成语=成语;
}
//接球手和接球手
目标是保留另一个名为“写作”的专栏,这是语言知识方面的一个技能水平,有“C1”、“C2”、“B1”、“B2”、“A1”、“A2”和“本机”(可能是列举的?)。
提前感谢!

您不能这样设置它们。如果您想将其他信息持久化到多对多映射,您需要创建一个单独的实体并将该实体映射到映射表。然后在代码中相应地使用简单的
@OneToMany
@ManyToOne
映射。请阅读更多信息,谢谢您的回复@XtremeBaumer!我将尝试用Vlad的方法实现。干杯,如果你能接受将
语言
属性转换为
映射
,那么你可以使用。谢谢@crizzis的回复。如果第一种方法不起作用,我将尝试你的建议。干杯,你不能这样设置它们。如果你想继续使用其他方法信息到多对多映射,您需要创建一个单独的实体并将该实体映射到映射表。然后您在代码中相应地使用简单的
@OneToMany
@ManyToOne
映射。阅读更多内容感谢您的回复@XtremeBaumer!我将尝试使用Vlad的方法实现。谢谢您的支持e,如果您能接受将
语言
属性转换为
地图
的过程,谢谢@crizzis的回复。如果第一种方法不起作用,我将尝试您的建议。干杯