JPA+EJB 不是websocket通信中的托管实体
JPA+EJB not managed entity in websocket communication
- 使用websocket连接的浏览器和服务器
- 连接后,浏览器会发送数据,并在服务器端通过方法'firstMessage'处理。此方法将 Player 实体存储到名为 'player' 的变量并更改其数据(它工作正常,数据库正在更改)
接下来,浏览器再次发送在服务器端处理的数据'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' 不更新数据库
到目前为止我尝试了什么:
- 我已经检查了 class 引擎,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
对象在事务完成之前一直是当前持久性上下文的一部分(可能是在方法 returns 时)。
第二种方法无效,因为 player
不再是任何持久性上下文的一部分。 merge
操作将其合并回持久性上下文,如果它已在您的调用链中较早加载,则可能返回不同的实例。
- 使用websocket连接的浏览器和服务器
- 连接后,浏览器会发送数据,并在服务器端通过方法'firstMessage'处理。此方法将 Player 实体存储到名为 'player' 的变量并更改其数据(它工作正常,数据库正在更改)
接下来,浏览器再次发送在服务器端处理的数据'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' 不更新数据库
到目前为止我尝试了什么:
- 我已经检查了 class 引擎,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
对象在事务完成之前一直是当前持久性上下文的一部分(可能是在方法 returns 时)。
第二种方法无效,因为 player
不再是任何持久性上下文的一部分。 merge
操作将其合并回持久性上下文,如果它已在您的调用链中较早加载,则可能返回不同的实例。