持久分离对象出错 "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
- 再次合并钱包,使对象再次被管理,或者
- 再次从数据库中获取新创建的钱包并将其附加到用户。这样当退出时
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 不是一个新实体而是已经存在。
我遇到错误 during synchronization a new object was found through a relationship that was not marked cascade PERSIST: Wallet ...
我知道错误通常是由于您没有 CascadeType.PERSIST
并且没有专门保留该实体,但我的故事可能会有所不同,因为我确实保留了该实体。
我在交易中创建用户,然后将用户传递给新交易,在新交易中创建钱包并将其附加到用户。
退出 createUser
函数时出现错误。
虽然我知道将托管对象传递给新事务并在那里进行更改是个坏主意,但我希望代码在 Spring 上下文中工作。但是我不确定为什么它会在 J2EE 中抛出错误。
我还发现您可以在退出前执行以下操作之一来修复它 createUser
- 再次合并钱包,使对象再次被管理,或者
- 再次从数据库中获取新创建的钱包并将其附加到用户。这样当退出时
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 不是一个新实体而是已经存在。