java - 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);
}
}
当我从数据库中加载课程时,评论会使用 Persistent Bag 进行初始化。当我打电话时出现问题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 是 a Collection.EmptyList
,它是不可变的,因此无法添加任何评论。
我需要更改哪些内容才能添加评论?
解决方案
好的,所以看起来龙目岛和休眠并没有像我预期的那样真正协同工作。此外,我用以下 lombok 符号注释了我的实体:
@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
. 现在 anew ArrayList<>()
被分配给不可变列表。现在我不能使用创建的单一构建器方法,但至少它可以工作。
推荐阅读
- kubernetes - 云提供商未正确初始化
- maven - maven-surefire-plugin 在 SpringBoot 2.2.2.RELEASE 及更高版本中不起作用
- c++ - 如何将 cv::Mat 转换为 void*
- javascript - 阿拉伯语 JavaScript 中的日期时间
- mpi - 程序完成后 mpirun 挂起
- angular - 带有 Angular 和 Spring 的 Websocket
- c# - 'System.String[]' 不能映射到原始类型
- r - 如何在 nls 的 poly 方法中包含参数“a”?
- javascript - 如何在react.js中处理请求标头接受application / ld + json获取请求
- java - 如何使用保存方法更新 Spring Boot 中的元素?