JPA一对多更新失败

时间:2016-10-26 21:27:35

标签: java hibernate jpa

@Entity
public class Post {

private Set<Comment> comments = new LinkedHashSet<Comment>();

@OneToMany(mappedBy = "businessunit", fetch = FetchType.LAZY, cascade = { CascadeType.ALL }, orphanRemoval = true)
public Set<Comment> getComments() {
  return comments;
}
} 

@Entity
public class Comment {

private Post Post;
private BUnit bUnit;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "POST_ID", referencedColumnName = "ID")
public Post getPost() {
    return post;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BU_ID", referencedColumnName = "ID")
public BUnit getBUnit() {
    return bUnit;
}
}

我有一个包含子集的父类。添加操作正常,因为我将注释添加到Set中,当我保存父项时,也保存了子项。

对于更新操作,我将收到现有评论和新评论。我更新现有注释的modified_by字段,并为新注释设置了所需的字段。接下来我清除该集并添加所有注释(新的和现有的注释),这样我就不会得到all-delete-orphan错误。

post.getComments().clear();
post.getComments().addAll(newComments);
dao.update(post);

更新抛出异常org.hibernate.LazyInitializationException:懒得初始化角色集合:

如何修复此问题的任何想法,其中子元素将包含新元素和现有元素。

感谢。

2 个答案:

答案 0 :(得分:0)

对于初学者,您的mappedBy = "businessunit"需要引用另一方的属性名称,在本例中为post

如果您仍然看到异常,可以查看here。 (这种例外有多种原因。)

最后,还有一个小问题,您不需要明确标记fetch = FetchType.LAZY,因为这是默认值。您可以删除它以提高可读性。

答案 1 :(得分:0)

我找到了解决方案。更新是在事务下执行的,并且工作正常。在事务之外,我正在访问db模型子对象以转换为ui模型。这也是异常的原因,我也不需要访问子元素,所以最终我删除了它。