2011-05-25 17 views
1

我们遇到了Spring 3.0.5事务管理和OpenJPA 2.0.1的问题,并且我们似乎无法查明问题,因此无法获得任何帮助。来自代理服务方法的Spring + OpenJPA TransactionRequiredException

该架构可以被分解如下:

服务层

@Autowired 
private DAOInterface daoReference; 
.... 
public void doStuff() { 
    boolean test = performCheck(); 
} 
.... 
private boolean performCheck() { 
    return daoReference._performDAOCheck(); 
} 

DAO-层

@PersistenceContext 
private EntityManager entityManager; 
..... 
@Transactional 
public boolean _performDAOCheck() { 
    boolean result = true; 
    // fetch entity manager, perform something and return boolean value 
    return result; 
} 

该代码执行,因为它应该,但我们真的不喜欢DAO层上事务划分的存在,并且想要进行转换将此服务层上面的服务层。

但是我们应该将@Transactional注释移动到服务层委托方法并将其从DAO层中删除,我们得到javax.persistence.TransactionRequiredException,它指示事务是必需的,但不是活动的。

问题是 - 为什么以及如何从委托方法“激活”事务?请注意,我们已经尝试过各种事务传播修饰符,但它似乎没有做任何有用的事情(REQUIRES_NEW在此上下文中是唯一实际可用的,但我们尝试了其他方法来保证安全)。

应用程序的堆栈如下:

  1. 弹簧3.0.5
  2. Bitronix 2.1.1
  3. OpenJPA的2.0.1
  4. 的Tomcat 6.0.32
  5. 的JUnit 4.8.2是用作测试框架

回答

0

为了将来的参考 - 似乎我们已经确定了t他的问题 - 这是关于Spring AOP代理,它不会注意到本地方法调用。

如果服务层被移动到另一个spring bean,然后被注入然后调用,proxy正确地生成一个新的事务上下文,并且这个事情就像一个魅力一样。

相关问题