gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:21:53 25 4
gpt4 key购买 nike

  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”内的 Player 实体发生更改,未更新数据库

到目前为止我尝试过的:

  • 我已经检查了类 Engine、DaoPlayer 和 Player 是否相同实例(通过在创建时生成随机数)
  • 我在第二个消息中执行此操作,效果很好。但我不想这样。

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

    }

    我期待

    玩家币=999;应该足以更新数据库

最佳答案

你想做的事情是不可能的。

您需要将 secondMessage 编码为

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

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

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

关于java - JPA+EJB不是websocket通信中的托管实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31131287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com