如何解决Hibernate使用不可变列表初始化集合
我有以下实体:
@Entity(name = "courses")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Singular
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private Collection<Comment> comments = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY,optional = false)
private User createdBy;
public void addComment(Comment comment) {
comments.add(comment);
}
}
当我从数据库中加载课程时,注释将用一个“持久性包装袋”初始化。当我致电addComment(comment)
时出现问题,然后出现此异常:
Caused by: java.lang.UnsupportedOperationException: null
at java.base/java.util.AbstractList.add(AbstractList.java:153) ~[na:na]
at java.base/java.util.AbstractList.add(AbstractList.java:111) ~[na:na]
at org.hibernate.collection.internal.PersistentBag.add(PersistentBag.java:408) ~[hibernate-core-5.4.18.Final.jar:5.4.18.Final]
休眠分配的Persistant Bag似乎是Collection.EmptyList
,它是不可变的,因此不能添加任何注释。
我需要更改什么才能添加评论?
解决方法
好吧,看起来龙目岛和冬眠似乎并没有像我预期的那样真正地协同工作。另外,我为我的实体添加了以下龙目岛符号:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Course {
//...
@Singular
@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
private List<Comment> comments = new ArrayList<>();
}
当我从数据库加载一个实体时,lombok似乎使用了构建器模式来创建一个新实例。这将导致注释被分配了Collection.EmptyList,然后由于其不可变而无法添加新注释。我的解决方法是/正在删除@Singular
并添加@Builder.Default
。现在分配了一个new ArrayList<>()
而不可变列表。现在,我无法使用创建的单一生成器方法,但至少可以使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。