我的Spring/HHibernate应用程序中有一个大的Service方法,以前它不是事务性的,而且工作正常。我一向其中添加@Transactional(readOnly = false, rollbackFor = {Exception.class})
,该方法的Select(Fetch(部分就开始在Select语句处中断(甚至在任何持久化之前(:
org.hibernate.PersistentObjectException: detached entity passed to persist: app.domain.Activities
在此代码中:
@Transactional(readOnly = false, rollbackFor = {Exception.class})
public String save(PlansModel plan, String id, Model model,HttpServletRequest request) throws IllegalAccessException, InvocationTargetException {
//...
//... some initial Selects - NO Persistence yet
Project proj = planService.getProjectByID(projId); // <-- BROKE HERE "detached entity passed to persist"
// ... NO Persistence yet
// ...
// At the end, some persistence starts
planService.savePlan(plan); //etc.
}
我们正在维护这个混乱的代码,很难分析是什么原因造成的。一些对象正在那里被修改。
我们决定通过将@Transactional
放在实际持久性的底部来解决这个问题,这对事务性来说至关重要。(我们的目标是确保整个方法具有事务性/回滚性。(
但当我们这样做的时候,我们发现在这个新的设计中,在出现错误的情况下,事务不会被回滚。我们把它分成了两个方法,只有第二个方法是@Transactional
,但这里没有回滚,事务机制也不起作用。它在其他地方都起作用。
public String save(PlansModel plan, String id, Model model,HttpServletRequest request) throws IllegalAccessException, InvocationTargetException {
//...
//... some initial Selects - NO Persistence yet
Project proj = planService.getProjectByID(projId); // <-- WORKING AGAIN without @Transactional
// ... NO Persistence yet
// ...
return persistPart(..); // for persistence
}
@Transactional(readOnly = false, rollbackFor = {Exception.class})
public String persistPart(..) {
planService.savePlan(plan); // <-- NO ROLLBACK from here
}
似乎我们正在处理的方法在添加@Transactional
后就出现了一些问题,但我们需要确保为其启用事务性/回滚。基于这些症状,有人知道解决方案是什么吗?
@Transactional
在服务类内部调用此方法时不起作用。这不仅适用于@Transactional
。这是Spring AOP的一个限制。
你的问题几乎是这个问题的重复。因此,您要么需要将此服务注入自身,并在注入的对象上调用此事务性方法,要么创建另一个将调用此事务方法的服务