【问题标题】:JPA mapping unidirectional @ManyToMany with struts2JPA映射单向@ManyToMany与struts2
【发布时间】:2014-09-15 17:17:32
【问题描述】:

大家好,

@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&lt;Player&gt;,我扩展了一个播放器,我看到List&lt;Roles&gt; 带有一个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


【解决方案1】:

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

【讨论】:

  • 对不起@Kanagaraj M,我忘记写了,我已经尝试使用注释@ManyToMany(fetch = FetchType.EAGER)这样做,但它是一样的。
  • 然后使用会话本身打印您的值。如果映射错误,您只会得到映射异常,而不是这个。
  • 抱歉,您能说得更准确一点吗?
  • 尝试在休眠会话本身中打印所有值。
【解决方案2】:

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

  1. 打开交易。

2.- 查询数据库。

3.- 获取所有数据并将其移动到另一个数据结构(某些 DTO),该结构仅包含您想要的数据。这也适用于角色。

4.- 关闭交易。

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

【讨论】:

  • 如果我使用 JTA 和 CMT,我如何打开和关闭事务?使用这种方法,分界事务由容器管理。
  • @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) public XXX methodA() {} 我使用这个符号来划分方法中的事务。方法结束后,事务关闭
猜你喜欢
  • 2014-05-17
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多