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