JPA使用struts2映射单向@ManyToMany

时间:2014-09-15 17:17:33

标签: java hibernate jpa struts2 hibernate-mapping

Hy guys,

我遇到@OneToMany单向关联问题。 基本上在我的模型中,我有两个实体:PlayerRole。我使用@ManyToMany原因映射此关系:一个玩家可以拥有更多角色,一个角色可以与多个玩家相关联。

Player.java

@Entity
public class Player implements Serializable {
    ...
    @ManyToMany
    private List<Role> roles;
    ...
}

Role.java

@Entity
public class Role implements Serializable {
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String roleName;
    ...
}

我用struts2打印我的播放器列表,如下所示:

<table>
...
   <s:iterator value="players" status="player">
     <tr>
     <td><s:property value="name"/></td>
     <td><s:property value="price"/></td>
     <td>
         <s:iterator value="roles" status="role">
             <s:property value="roleName"/>
         </s:itetator>
     </td>
  </s:iterator>
...
</table>

我收到了这个错误:

org.hibernate.LazyInitializationException - failed to lazily initialize a collection of role: no session or session was closed.

为什么我收到此错误? JPA映射是错误的吗? 我试图删除(仅用于检查)角色内部迭代器,我可以很好地看到玩家表,但显然没有我需要的角色。

注意:我尝试调试应用程序,当我在操作中时,我得到List<Player>,我扩展了一个播放器,我看到了List<Roles> Persistent Bag变量,我试图再次最大化,但我无法获得roleName变量。

有人可以帮我解决问题吗? 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您正在尝试访问关闭hibernate会话后暂停初始化的hibernate结果。这就是你得到这个错误的原因。通过fetchType将初始化类型更改为eager。

答案 1 :(得分:0)

实际上,如果EAGER解决方案不起作用,我认为您唯一的选择是在获取所有数据时保持事务处于打开状态。所以基本上:

  1. open transaction。
  2. 2.-查询数据库。

    3.-获取所有数据并将其移动到另一个仅包含所需数据的数据结构(某些DTO)。这也将转到角色。

    4.-关闭交易。

    5.-使用DTO结构生成响应