持久分离对象出错 "during synchronization a new object was found through a relationship that was not marked cascade PERSIST"

Persisting detached object got error "during synchronization a new object was found through a relationship that was not marked cascade PERSIST"

我遇到错误 during synchronization a new object was found through a relationship that was not marked cascade PERSIST: Wallet ...
我知道错误通常是由于您没有 CascadeType.PERSIST 并且没有专门保留该实体,但我的故事可能会有所不同,因为我确实保留了该实体。

我在交易中创建用户,然后将用户传递给新交易,在新交易中创建钱包并将其附加到用户。
退出 createUser 函数时出现错误。
虽然我知道将托管对象传递给新事务并在那里进行更改是个坏主意,但我希望代码在 Spring 上下文中工作。但是我不确定为什么它会在 J2EE 中抛出错误。

我还发现您可以在退出前执行以下操作之一来修复它 createUser

  1. 再次合并钱包,使对象再次被管理,或者
  2. 再次从数据库中获取新创建的钱包并将其附加到用户。这样当退出时createUser,它知道钱包不是一个新实体而是已经存在。

如果有人能告诉我 J2EE 和 Spring 这段代码在前者中不起作用的区别,我将不胜感激。

// existing transaction 
public void createUser(){
        User user = userRepo.createUser();
        walletService.createAndAttachWalletToUser(user);
        // add to fix
        // user.setWallet(walletService.merge(user.getWallet())); OR
        // user.setWallet(walletService.getWallet(user.getWallet().getId()));
}

// WalletService class
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void createAndAttachWalletToUser(User user){
        Wallet wallet = walletRepo.createWallet();
        user.setWallet(wallet);
}

这个问题有一段时间没有得到解答,所以在这里发布解决方法:

您可以在退出前执行以下操作之一来修复它 createUser

再次合并钱包,使对象再次被管理,或者 再次从 DB 获取新创建的钱包并将其附加到用户。这样当退出 createUser 时,它知道 wallet 不是一个新实体而是已经存在。