簡體   English   中英

WebSocket通信中的JPA + EJB不是受管實體

[英]JPA+EJB not managed entity in websocket communication

  1. 與websocket連接的瀏覽器和服務器
  2. 連接后,瀏覽器將發送數據,並通過“ firstMessage”方法在服務器中進行處理。 此方法會將Player實體存儲到名為“ player”的變量並更改其數據(工作正常,數據庫已更改)
  3. 接下來,瀏覽器再次通過“ secondMessage”方法在服務器中處理數據。 它將更改之前已存儲的Player實體數據。 數據已更改,但問題是數據庫未更改

     @Singleton @Startup public class Engine { @Inject DaoPlayer daoPlayer; Player player; public void firstMessage(clientId){ player = daoPlayer.findById(clientId); player.coin = 3; } public void secondMessage(){ player.coin = 999; 

    }

問題:

方法“ secondMessage”中的播放器實體中的更改未更新數據庫

到目前為止,我嘗試了什么:

  • 我已經檢查了Engine,DaoPlayer和Player類是否是同一實例(通過在創建它們時生成隨機數)
  • 我在secondMessage中做到這一點,並且工作正常。 但我不想這樣。

     public void secondMessage(){ player.coin = 999; daoPlayer.getEntityManager().merge(player); 

    }

    我期待

    player.coin = 999; 應該足以更新數據庫

您試圖做的事是不可能的。

您需要將secondMessage編碼為

public void secondMessage() {
    player.coin = 999;
    player = daoPlayer.merge(player);
}

您的第一個方法之所以有效,是因為player對象在事務完成之前(可能是在方法返回時)仍是當前持久性上下文的一部分。

第二種方法不起作用,因為player不再是任何持久性上下文的一部分。 merge操作將其合並回到持久性上下文中,如果已在調用鏈中較早地加載它,則可能返回不同的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM