Hy guys,
我遇到@OneToMany
单向关联问题。
基本上在我的模型中,我有两个实体:Player
和Role
。我使用@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
变量。
有人可以帮我解决问题吗? 提前谢谢。
答案 0 :(得分:0)
您正在尝试访问关闭hibernate会话后暂停初始化的hibernate结果。这就是你得到这个错误的原因。通过fetchType将初始化类型更改为eager。
答案 1 :(得分:0)
实际上,如果EAGER解决方案不起作用,我认为您唯一的选择是在获取所有数据时保持事务处于打开状态。所以基本上:
2.-查询数据库。
3.-获取所有数据并将其移动到另一个仅包含所需数据的数据结构(某些DTO)。这也将转到角色。
4.-关闭交易。
5.-使用DTO结构生成响应