首页 > 解决方案 > 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,它是不可变的,因此无法添加任何评论。

我需要更改哪些内容才能添加评论?

标签: javahibernatejpa

解决方案


好的,所以看起来龙目岛和休眠并没有像我预期的那样真正协同工作。此外,我用以下 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<>()被分配给不可变列表。现在我不能使用创建的单一构建器方法,但至少它可以工作。


推荐阅读