【发布时间】:2014-09-15 17:17:32
【问题描述】:
大家好,
@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 变量。
有人可以帮我找出问题所在吗? 提前致谢。
【问题讨论】:
-
加载一对多关联是浪费时间,如果您需要为特定玩家创建角色列表,只需通过传递玩家 ID 来调用查询。
-
其实不是只针对一个玩家,而是针对一个玩家的名单。
-
没什么区别。
-
类似这样的:
select p from Player p join p.roles r where p.id = :id? -
是的,类似这样,但所有者不同。注意正确的命名使您的代码更具可读性,例如ball 是单数,而 balls 是复数。
标签: java hibernate jpa struts2 hibernate-mapping