我在程序执行期间收到以下异常:
org.hibernate.ObjectDeletedException: deleted instance passed to merge: [ns.entity.Category#<null>]; nested exception is java.lang.IllegalArgumentException: org.hibernate.ObjectDeletedException: deleted instance passed to merge: [ns.entity.Category#<null>]
以下代码抛出异常:
importer.foo();
进口商服务:
@Service
@Transactional
public class Importer {
@Autowired
private UserService userService;
@Autowired
private CategoryService categoryService;
@Transactional
public void foo() {
User user = userService.findByLogin("max");
categoryService.delete(user.getCategories());
}
}
UserService(使用CrudRepository):
@Service
@Repository
@Transactional
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository repository;
@Override
@Transactional(readOnly = true)
public User findById(Long userId) {
return repository.findOne(userId);
}
}
CategoryService(使用CrudRepository):
@Service
@Repository
@Transactional
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryRepository repository;
@Override
@Transactional
public void delete(Set<Category> categories) {
repository.delete(categories);
}
}
CategoryServiceImpl.delete()
中的以下代码段无一例外地工作:
for (Category category : categories) {
Category newCat = findById(category.getCategoryId());
if (newCat != null) {
delete(newCat);
}
}
根据我的理解,使用了两个不同的事务(一个只读,一个删除)。是否可以为所有通话重复使用该交易?从(readOnly = true)
中移除UserServiceImpl.findById()
无济于事。
根据Spring文档,我认为只有一个事务应该用于所有三种方法(Importer.foo()
,UserServiceImpl.findById()
,CategoryServiceImpl.delete()
)。