一尘不染

在Play框架中使用ElementCollection时出现LazyInitializationException

hibernate

我的应用程序模型集中有一个User实体,其定义如下:

public class User extends Model {

    private String name;

    private byte[] sk;

    @Column(columnDefinition = "BINARY(272)")
    private byte[] pk;

    private int port;

    @OneToOne
    public Profile profile;

    @ElementCollection
    public List<String> friends;

    @ElementCollection
        public List<String> mirrors;
...
}

并且在我应用程序不同部分(控制器类)中的方法中,我正在检索并尝试按以下方式修改镜像列表:

    User u = User.connect(username);
    int port = ProfileFinder.getLocation(username, mirror);
    u.mirrors.remove(mirror);
    u.save();

这引发了一个错误,指出:

LazyInitializationException occured : failed to lazily initialize a collection of role: models.User.mirrors, no session or session was closed

我怀疑这是由于我误解了@ElementCollection标签的某些元素,但是没有人能阐明我该如何纠正它?

谢谢。


阅读 248

收藏
2020-06-20

共1个答案

一尘不染

默认情况下,XxxToMany关联和元素集合是延迟加载的。

这意味着仅当需要调用一种收集方法时,才从数据库中加载收集元素。但是,当然,实体需要附加到其会话上才能起作用。如果会话关闭,则会引发您收到的异常。

您可以通过设置批注的fetch属性使它急切地加载,或者在返回之前使用事务中的初始化集合的查询或服务。请注意,如果您急切地加载它,即使您不需要collection元素,也总是会急切地加载它。

2020-06-20