如何在实体中添加对象列表

时间:2017-12-31 10:40:40

标签: java spring-boot spring-data-jpa

我在java中编写一个简单的spring boot应用程序。我想在我的实体模型中添加一个对象列表,但每次出现错误。 有人可以指导我代码应该是什么样的吗? 我也在使用JPA存储库,PostgreSQL数据库和Swagger。

public class Candidate {

@Id
@GeneratedValue
@ApiModelProperty(hidden = true)
@Column(name = "UUID", unique = true, length = Integer.MAX_VALUE)
private Long uuid;

@ManyToMany(cascade=CascadeType.ALL)
//@ElementCollection
private List<CandidateSkills> skills; 
}

CandidateSkills列表:

@Entity
@Table(name = "CANDIDATE_TABLE_SKILLS")
public class CandidateSkills {

@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private long id;

private String skillName;

private int skillLevel;
}

错误: hibernate.PersistentObjectException:传递给persist的分离实体:com.employee.api.models.CandidateSkills

2 个答案:

答案 0 :(得分:1)

我不确定你是否需要“多对多”关系,也许“一对多”关系对你有用。

无论如何,如果你想添加“Many To Many”关系,你需要添加另一个表来引用这两个表,但是Spring为你做了:)只是想为那个表定义名称(在这个例子中是“inner_table”) )

您需要在Candidate类的实体字段定义中添加@JoinTable注释,如下所示:

.....
@ManyToMany(cascade=CascadeType.ALL)
    @JoinTable(
        name = "inner_table",
        joinColumns = {@JoinColumn(name = "candidate_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "candidateSkills_id", referencedColumnName = "id")})
private List<CandidateSkills> skills; 
....

并在CandidateSkills类中定义引用,如下所示:

@ManyToMany(mappedBy = "skills")
private List<Candidate> Candidates; 

答案 1 :(得分:0)

我找到了解决方案。这非常简单。 的 CandidateSkills将@Entity更改为@Embeddable

在列表中:

@ElementCollection
@CollectionTable(
        name="CANDIDATE_SKILLS_TABLE",
        joinColumns=@JoinColumn(name="UUID")
)
private List<CandidateSkills> skills;

请访问: https://en.wikibooks.org/wiki/Java_Persistence/ElementCollection