p:datatable - update ManyToMany属性导致LazyInitializationException

时间:2014-06-21 01:09:08

标签: hibernate jsf primefaces lazy-initialization

我在ManyToMany关系中有两个实体。 “用户”和“汽车”。

我有一个所有用户的 p:dataTable ,包括一个包含每个用户二手车的列:

XHTML

<h:form>
<p:dataTable value="#{usersPM.users}" var="user">
  <p:column>
    <p:inputText value="#{user.name}">
      <p:ajax event="blur" listener="#{usersPM.onEdit(user)}"/>
    </p:inputText>
  </p:column> 
  <p:column>
    <p:selectCheckboxMenu value="#{user.cars}">
      <f:selectItems value="#{usersPM.allCars}" />
      <p:ajax />
    </p:selectCheckboxMenu>
  </p:column>
</p:dataTable>

现在,我想使用 p:selectCheckboxMenu 更新用户的汽车列表。 没有保存按钮 - 一切都应该通过ajax处理(对于名称btw工作正常)。

p:selectCheckboxMenu 组件包含所有可用的汽车。除此之外,为每个用户正确选择了当前分配的汽车。

一旦我尝试修改列表,我就收到:

  

org.hibernate.LazyInitializationException:懒得初始化集合,没有关闭会话或会话

问题出在这里?用户和汽车已加载 - 否则将无法正确显示(?)

以下实体/豆类:

@Entity
public class User{
   @ManyToMany
   private List<Car> cars;
}

@Entity
public class Car{
   @ManyToMany( mappedBy = "cars" )
   private List<User> users;
}

@ManagedBean
@ViewScoped
public class UsersPM{
  private List<Car> allCars;
  private List<User> users;

  @PostConsruct
  public void init(){
    users = userDao.findAllAndLoadCars();
    cars = carDao.findAll();
  }
}

1 个答案:

答案 0 :(得分:4)

要解决此问题,您应该为具有属性name=”collectionType”的组件提供集合类型。

<p:selectCheckboxMenu value="#{user.cars}">
  <f:attribute name="collectionType" value="java.util.ArrayList" />
  <f:selectItems value="#{usersPM.allCars}" />
  <p:ajax />
</p:selectCheckboxMenu>

阅读更多: