我的应用程序模型集中有一个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标签的某些元素,但是没有人能阐明我该如何纠正它?
@ElementCollection
谢谢。
默认情况下,XxxToMany关联和元素集合是延迟加载的。
XxxToMany
这意味着仅当需要调用一种收集方法时,才从数据库中加载收集元素。但是,当然,实体需要附加到其会话上才能起作用。如果会话关闭,则会引发您收到的异常。
您可以通过设置批注的fetch属性使它急切地加载,或者在返回之前使用事务中的初始化集合的查询或服务。请注意,如果您急切地加载它,即使您不需要collection元素,也总是会急切地加载它。