Spring MVC加载了很多关系

时间:2011-07-10 16:21:51

标签: hibernate spring-mvc many-to-many

我在餐馆和标签之间建立了很多关系。这是我的课程:

public class Restaurant {
    @Id
    @GeneratedValue
    private int id;
(...)
    @ManyToMany
    @JoinTable(name="restaurant_tag",
            joinColumns={@JoinColumn(name="restaurant_id")},
            inverseJoinColumns={@JoinColumn(name="tag_id")})
    private List<Tag> tags;

public class Tag {
    @Id
    private int id;
    private String name;
    @ManyToMany
    @JoinTable(name="restaurant_tag",
            joinColumns={@JoinColumn(name="tag_id")},
            inverseJoinColumns={@JoinColumn(name="restaurant_id")})
    private List<Restaurant> restaurants;

我想显示与我的餐厅相关的所有标签。这是控制器:

modelMap.addAttribute("tagList", restaurant.getTags());

在我的jsp中:

<c:forEach items="${tagList }" var="var"><c:out value="${var }" ></c:out></c:forEach>

当我去餐厅页面时,我收到了错误:

  

org.hibernate.LazyInitializationException:   没有懒惰地初始化一个   角色集合:   beans.Restaurant.tags,没有会话或   会议已经结束

2 个答案:

答案 0 :(得分:1)

您需要在视图模式中使用开放会话。在web.xml中添加第一件事

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

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

答案 1 :(得分:0)

这是因为您的DAO在获取集合之前关闭了休眠会话。

看看"Open Session In View" pattern,这是解决此问题的最常见方法。