多个服务中的事务问题(Spring Framework / JTA):org.hibernate.ObjectDeletedException:传递给合并的已删除实例

时间:2013-07-28 15:09:09

标签: spring hibernate jpa jta spring-transactions

我在程序执行期间收到以下异常:

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())。

0 个答案:

没有答案