JPA+EJB 不是websocket通信中的托管实体

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;
    

    }

问题:

在方法内部更改 Player 实体 'secondMessage' 不更新数据库

到目前为止我尝试了什么:

你想做的事是不可能的。

您需要将 secondMessage 编码为

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

您的第一个方法有效,因为 player 对象在事务完成之前一直是当前持久性上下文的一部分(可能是在方法 returns 时)。

第二种方法无效,因为 player 不再是任何持久性上下文的一部分。 merge 操作将其合并回持久性上下文,如果它已在您的调用链中较早加载,则可能返回不同的实例。