簡體   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