繁体   English   中英

JPA使用struts2映射单向@ManyToMany

[英]JPA mapping unidirectional @ManyToMany with struts2

大家好

我对@OneToMany单向关联有@OneToMany 基本上在我的模型中,我有两个实体: PlayerRole 我将这种关系与@ManyToMany映射为原因:一个玩家可以拥有更多角色,并且一个角色可以与多个玩家关联。

播放器

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

角色.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> ,我展开了一个Player,然后看到带有Persistent Bag变量的List<Roles> ,我尝试再次最大化,但我无法获取roleName变量。

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

您正在尝试访问休眠结果,该结果在关闭休眠会话后被延迟初始化。 这就是为什么您会收到此错误。 通过fetchType将初始化类型更改为eager。

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

  1. 公开交易。

2.-查询数据库。

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

4.-平仓交易。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM