Hibernate @Transactional没有启动事务

时间:2012-03-26 21:26:52

标签: spring hibernate transactions

我有一个使用Hibernate的Web应用程序,我试图保留一些数据,但是尽管使用了@Transactional注释,它仍无法在事务中持久存在。

我的服务类如下:

@Service("profileService")
public class ProfileService {
    private EntityManager entityManager;

    @Autowired
    private AccountService accountService;

    @Autowired
    private ProfileDAOImpl profileDao;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.entityManager = em;
    }

    @Transactional
    public void addConnectionToAccount(SocialConnection sc) {
        entityManager.persist(sc);
    }

}

正常方法从另一个Spring bean调用addConnectionToAccount()方法,并且当前正在注入ProfileService类:

public class HibernateConnectionRepository implements ConnectionRepository {

    @Inject
    private ProfileService profileService;

    @Override
    @Transactional
    public void addConnection(SocialConnection sc) {
        try {
            profileService.addConnectionToAccount(accountId, sc);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

我尝试将@Transactional注释放在调用方法上,徒劳地希望它可能有所作为,但没有。

以前我遇到过这样的问题,因为持久化的对象不满足表限制(例如非可空列为null),或者因为该方法是在同一个类中调用而调用方法不是交易,但这两种情况都不是这样的。

有什么想法吗?它只是默默地失败,日志如下:

2012-03-26 22:25:04,702 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace com.mchange.v2.resourcepool.BasicResourcePool@1bc25c8 [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@e5b006)
2012-03-26 22:25:04,710 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - select SEQ_COUNT from SEQUENCE where SEQ_NAME = 'PO_SEQ' for update
2012-03-26 22:25:04,711 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - update SEQUENCE set SEQ_COUNT = ? where SEQ_COUNT = ? and SEQ_NAME = 'PO_SEQ'
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace com.mchange.v2.resourcepool.BasicResourcePool@1bc25c8 [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@e5b006)
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 2200, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator

更新

还想提一下HibernateConnectionRepository bean没有注释,实际上是在@Configuration类中配置的(如果这有什么区别?没有多用@Configuration类。)

创建bean的方法如下:

@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
public ConnectionRepository connectionRepository() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication == null) {
        throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in");
    }
    ApplicationUser user = (ApplicationUser) authentication.getPrincipal();
    return usersConnectionRepository().createConnectionRepository(String.valueOf(user.getAccountId()));
}

bean的范围限定为登录用户,但也可能为每个用户多次创建..

2 个答案:

答案 0 :(得分:1)

还有一些事情要看(虽然你有一个很好的开始约束和从同一个bean调用):

  • {x}文件中存在<tx:annotation-driven />
  • 确定交易没有开始吗?查看TransactionSynchronizationManager.isActualTransactionActive()。它可能是一个不同的(与交易无关的问题)

答案 1 :(得分:0)

错误是方面未正确触发的问题。

与此问题相关:Let eclipse use maven to compile/weave my code使用新版本的Eclipse和M2E发生。

Eclipse clean并没有编织方面,所以事务注释没有被编织。它间歇性地工作,因为当我做一个正常的maven干净安装(命令行等)然后编织将完成(Eclipse干净然后没有编织,所以如果我做maven干净安装然后日食重建它会不行。)。

我通过在Eclipse中的项目中添加一个AspectJ构建器来修复此问题,现在当我自动运行clean / build时,它会正确编织它。