我试图简短地描述我的环境。技术:EJB 3.1、JSF、JBoss 7.1.1
有服务类(@SessionScoped @Stateful)。服务类调用 Dao 类 (@Stateless)
我想 :
- 仅在 @StateLess bean 中使用 EntityManager (Dao)
- 在大多数情况下有短事务(如持久化、合并)
- 对一些多步骤方法有一个长事务(方法也在 Dao 中)
- 有实际的(最新的,没有一级缓存的)数据
我有:Pesistense.xml
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:jboss/datasources/MydataSource</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.dialect"value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
<property name="hibernate.connection.autocommit" value="true"/>
<property name="hibernate.connection.characterEncoding" value="utf8"/>
<property name="hibernate.c3p0.min_size" value="5"/>
<property name="hibernate.c3p0.max_size" value="20"/>
<property name="hibernate.c3p0.timeout" value="1800"/>
<property name="hibernate.c3p0.max_statements" value="50"/>
</properties>
</persistence-unit>
道
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class UserDaoBean implements UserDAO, Serializable {
@PersistenceContext(name = "MyEntityManager")
private EntityManager em;
@Override
@Transactional
public void update(User user) throws Exception {
User tmpUser = getUser(user.getUser());
//some code, should be rollback, if it is an exception
em.persist(tmpUser);
}
事务拦截器
@Transactional
@Interceptor
public class TransactionInterceptor implements Serializable {
@Resource
private UserTransaction userTransaction;
@AroundInvoke
public Object verifyAccess(InvocationContext context) throws
Exception {
Object result = null;
try {
userTransaction.begin();
result = context.proceed();
userTransaction.commit();
} catch (Exception e) {
userTransaction.rollback();
throw new CustomRuntimeException(e.getMessage());
}
return result;
}
}
问题:如果在 Dao 方法中抛出异常,部分数据将保存在 DB 中,而不是全部回滚。
我认为,需要将交易加入到 EM。或断开连接将每个项目立即保存到数据库(使用缓存)。我尝试了不同的方法,但没有成功。
提前感谢您!