当前位置: 首页 > 面试题库 >

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

裴宏壮
2023-03-14
问题内容

我的应用程序模型集中有一个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标签的某些元素,但是没有人能阐明我该如何纠正它?

谢谢。


问题答案:

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

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

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



 类似资料:
  • 我正在尝试在Play Framework中实现SOAP Web服务客户端。我找到了lib,但找不到存储库: https://github.com/playframework/play-soap http://downloads.typesafe.com/rp/play-soap/SbtWsdl.html 当我添加sbt插件<code>addSbtPlugin(“com.typesafe.play”

  • EasyWeChat 是一个通用的 Composer 包,所以不需要对框架单独做修改,只要支持 Composer 就能直接使用,当然了,为了更方便的使用,我们收集了以下框架单独提供的拓展包: Laravel overtrue/laravel-wechat Symfony lilocon/WechatBundle Yii jianyan74/yii2-easy-wechat 适用于 EasyWeCh

  • QueryList无框架依赖,可以灵活的嵌入到任何项目中去。 在使用Composer管理的项目中安装 在非Composer管理的项目中安装 QueryList可以集成到任何框架中去使用,无需做任何修改,直接使用Composer安装到项目中去即可。 在使用Composer管理的项目中安装 如果项目框架本身就是使用Composer来管理包的话,直接在项目根目录执行Composer安装命令后,即可在项目

  • **编程对象,Settings.UseJavaCP.Value=true。 Build.Scala

  • 问题内容: 当我使用https端口运行Play Framework时,应用程序在两个端口上启动- 默认(9000)和https(443)。如何禁用默认的9000端口并仅在https端口上运行Play应用程序? 我通过以下命令运行应用程序: 我得到一些日志: [info]播放-应用程序已启动(产品) [info]播放-侦听/ 0:0:0:0:0:0:0:0:9000上 的HTTP [info]播放-