当前位置: 首页 > 知识库问答 >
问题:

Spring MVC 3.1.2 Jackson 2:LazyInitializationException延迟初始化集合时出现异常-没有会话或会话被关闭

洪彬
2023-03-14

我对使用Spring MVC 3.1.2和Jackson 2的错误感到疯狂。

我有以下模型课:

@Entity
@Table(name = "USER")
@JsonIgnoreProperties(ignoreUnknown=true)
public class User implements Serializable
{
    @Id
    @SequenceGenerator(name = "USER_ID", sequenceName = "USER_ID_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USER_ID")
    private Long id;

    @Column(length = 50, nullable = false)
    private String firstName;

    @Column(length = 50, nullable = false)
    private String lastName;

    @ManyToMany
    @JoinTable(name = "FRIENDS",
        joinColumns = @JoinColumn(name = "personId"),
        inverseJoinColumns = @JoinColumn(name = "friendId")
    )
    @JsonManagedReference
    private List<User> friends;

    @ManyToMany
    @JoinTable(name="FRIENDS",
        joinColumns=@JoinColumn(name="friendId"),
        inverseJoinColumns=@JoinColumn(name="personId")
    )
    @JsonIgnore
    private List<User> friendOf;

    // Other attributes and methods... 
}

当我得到一个用户实例时,它由Jackson正确序列化。但当我尝试获取包含好友的用户实例时,会引发以下异常:

org.hibernate.延迟初始化角色集合失败:com.frooid.model.User.friends,没有会话或会话被关闭

我使用单个HQL获取此实例:

select u from User u left join fetch u.friends f where u.id = :id

感谢大家!

共有3个答案

年烈
2023-03-14

我也有类似的问题。方法是在定义属性的实体中,在每个属性上创建一个新类(视图),并在@JsonView({NewClass1.class,NewClass2.class})中添加这个类。您可以选择要作为响应的一部分加载的变量,并将该类包含在@JsonView中。就这么简单!

姬翰林
2023-03-14

默认情况下,许多关联都是延迟加载的。这意味着只有在调用好友列表的方法时,才会从数据库中加载用户的好友。

这种延迟加载只能在用于加载用户的会话打开时发生。因此,如果在没有加载好友列表的情况下从事务方法返回用户,会话将被关闭,尝试加载freinds列表将导致出现异常。

因此,如果客户端需要加载朋友列表,则使用HQL获取朋友,或者在服务方法内部强制初始化列表,方法是调用列表上的方法或调用Hibernate.initialize(user.get朋友())

编辑:因为您的HQL中有一个fetch,所以它应该可以工作。另一个问题是,双向关联映射了两次:一次映射到朋友字段,一次映射到朋友字段。必须使用mappedBy属性将其中一个关联标记为另一个的逆关联:

@ManyToMany(mappedBy = "friends")
@JsonIgnore
private List<User> friendOf;
薛欣荣
2023-03-14

尝试使用OpenSessionInViewFilter虽然这是为了访问视图中的惰性初始化字段,但它可能会保持会话打开,以便Jackson能够访问该集合。

OpenSessionInViewFilter将Hibernate会话绑定到线程以进行请求的整个处理。旨在用于“视图中的打开会话”模式,即允许在Web视图中延迟加载,尽管原始事务已经完成。

在网上。xml

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

API文档

 类似资料:
  • 问题内容: 好的,我在正在处理的应用程序中收到上述异常。我正在使用JPA并hibernate。这是堆栈跟踪: 调试时,我注意到它似乎来自Form实体中的部分代码: “ fields.isEmpty()”部分将异常向上抛出。 据我所读,这应该可以通过设置要热切获取的集合来解决。我认为问题是字段集合。但是… 它已经很热闹。这样做是为了解决开发早期遇到的另一个问题。 可能是什么问题呢? 添加: Form

  • 我在对象中使用Hibernate,即使会话未关闭,也会得到lazyinitializationexception。 以下是争议对象之间的关系。有3个对象: 目标A 对象B 对象C ObjectA包括ObjectB作为FetchType=EAGER ObjectB包括ObjectC作为FetchType=LAZY 我们正在获取ObjectA。因此,由于急切获取类型,它会自动获取ObjectB。但是当

  • 问题内容: 要获得答案,请向下滚动到此内容的结尾… 基本问题与多次询问相同。我有一个带有两个POJO事件和用户的简单程序-一个用户可以拥有多个事件。 用户: 注意:这是一个示例项目。我 真的 很想在这里使用Lazy抓取。 现在我们需要配置spring和hibernate,并有一个简单的basic-db.xml用于加载: 注意:我玩过CustomScopeConfigurer和SimpleThrea

  • 问题内容: 要获得答案,请向下滚动到此内容的末尾… 基本问题与多次询问相同。我有一个带有两个POJO事件和用户的简单程序-一个用户可以拥有多个事件。 用户: 注意:这是一个示例项目。我 真的 很想在这里使用Lazy抓取。 现在我们需要配置spring和hibernate,并有一个简单的basic-db.xml用于加载: 注意:我玩过CustomScopeConfigurer和SimpleThrea

  • 问题内容: 我有下一个错误: 我的实体: 我有一个服务班: 我从另一种服务方法调用服务: 但是,当我试图调用这个方法我收到线异常,当我打电话时,也会发生同样的异常上。我已经检查了事务管理器,并且配置正确,并且此步骤中存在事务。另外,我已经检查了关于与此异常相关的stackoverflow的大量答案,但没什么用。 可能是什么原因造成的? 问题答案: 看来模型是一个独立的实体。 尝试合并并在合并实例上

  • 我不明白为什么会发生这种情况。根据代码路径,当引发此异常时,我应该在同一线程中并且会话应存在。 有人能告诉我我错过了什么吗? 我有设置 在hibernate.cfg.xml档案里 我在Servlet过滤器中创建了以下代码 在index.xhtml文件中,我有以下调用: 做一些事情 index.xhtml正在使用使用ui include加载menu.xhtml文件的模板。然后,菜单文件会插入menu