如何在 Castor 库中映射延迟初始化的对象



在我的Spring MVC应用程序中,当脚轮尝试映射延迟启动的对象时,会发生错误。

我有与一对多关系的实体类:

@Entity
@Table(name = "a")
public class A implements Serializable {
    ...
    private Set<B> b_set=new HashSet<B>();
    @OneToMany(mappedBy = "a", cascade = CascadeType.ALL, orphanRemoval = true, fetch=FetchType.LAZY)
        public Set<b> getB_set() {
            return b_set;
        }
}

多对一关系的实体

@Entity
@Table(name = "b")
public class B implements Serializable {
    ...
    @ManyToOne
    @JoinColumn(name = "fk", insertable=false, updatable=false)
    private A a;
}

我使用Castor库将对象映射到xml。

<mapping>
    <class name="package.a">
        ...
        <field name="b_set" type="package.b" collection="set">
            <bind-xml name="b_name" node="element"></bind-xml>
        </field>
    </class>
    <class name="package.b">
        ...
    </class>
</mapping>

实体 A 有很多实体 B,所以我有 2 个选项。控制器可以返回具有惰性初始化的实体 A,也可以返回带有一组 B 的 A。

@RequestMapping(value = "/name/{name}", method = RequestMethod.GET)
    @ResponseBody
    public A findAByName(@PathVariable String name) {
        return aService.findByName(name);
    }
    @RequestMapping(value = "/b/{name}", method = RequestMethod.GET)
    @ResponseBody
    public A findAByNameWithB(
            @PathVariable String name) {
        return aService.findByNameWithB(name);
    }

在这两种方法中,Castor 映射返回的对象并尝试映射字段b_set。在第一种方法中,存在延迟初始化。当我使用第一种方法时出现问题,因为脚轮无法映射字段b_set:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: package.A.b_set, no session or session was closed

我理解这个错误,但我不知道如何以聪明的方式解决这种情况。我想同时拥有这两种方法。

我使用 Spring 3.1.0 版本、脚轮 1.3.2 和休眠实体管理器 3.6.8 最终版

我将不胜感激的帮助。

发生这种情况是因为您的 hibenrate 会话在您的 HTTP 响应完成之前关闭。

要解决它,您可以执行以下操作:

1) 将集合标记为 EAGER。2) 使用视图中打开会话模式。

您可以在此处阅读有关它的更多信息:

https://community.jboss.org/wiki/OpenSessionInView

春季带有开箱即用的"打开会话视图"解决方案。这非常易于使用:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewInterceptor.html

相关内容

  • 没有找到相关文章

最新更新