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

时间:2019-08-05 11:25:01

标签: java mysql spring hibernate jpa

使用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

目标是保留另一个称为“写作”的列,该列是就语言知识而言的技能级别,并且级别为“ C1”,“ C2”,“ B1”,“ B2”,“ A1”,“ A2” ”和“本机”(也许是枚举?)。 预先感谢!

0 个答案:

没有答案