@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模型。这就是异常的原因,我也不需要访问子元素,所以最终我删除了它。