几个DAO层之间的交易?

时间:2009-10-28 02:51:47

标签: java hibernate spring transactions dao

如下所示,我正在访问另一个DAO内部的服务层方法。 (系统中的每个DAO都使用HibernateDAOSupport类实现)

我想在#1或#2(在以下代码中注释)失败时回滚事务。 但是当#2抛出异常时,#1不会被回滚,我可以看到数据库中的条目。

@Transactional(readOnly=false, rollbackFor={DuplicateEmailException.class,DuplicateLoginIdException.class,IdentityException.class},propagation=Propagation.REQUIRES_NEW)
    public void createUserProfile(UserProfile profile)
            throws DuplicateEmailException, DuplicateLoginIdException,
            IdentityException {

        // #1 create principal using Identity Service
        identityService.createPrincipal(profile.getSecurityPrincipal());

        try {
        // #2 save user profile using Hibernate Template
            getHibernateTemplate().save(profile);
        } catch (RuntimeException e) {
            throw new IdentityException("UseProfile create Error", e);
        }

}

这是'IdentityService'的createPrincipal()方法的签名。

public void createPrincipal(Principal principal) throws DuplicateEmailException,DuplicateLoginIdException,IdentityException ;

“IdentityService”

中没有配置事务管理

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

尝试Propagation.REQUIRED,而不是Propagation.REQUIRES_NEW

答案 1 :(得分:0)

在通话过程中identityService.createPrincipal(profile.getSecurityPrincipal());你不是在刷新会话吗? (例如,使用FlushMode.AUTO执行查询)