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;
}
}

我有一个包含一组子类的Parent类。当我将注释添加到Set时,添加操作工作正常,当我保存父节点时,子节点也被保存。

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

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

Update抛出异常org.hibernate.LazyInitializationException: failed to lazy initialize a collection of role:

对于子元素将包含一个新的和现有的元素的更新,有什么想法来解决这个问题吗?

谢谢。

首先,您的mappedBy = "businessunit"需要引用另一侧的属性名称,在本例中为post

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

最后,也是次要的一点,您不需要显式标记fetch = FetchType.LAZY,因为这是默认的。您可以删除它以提高可读性。

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

最新更新