我遇到了事务回滚问题。
我需要先将用户插入数据库,然后在另一个表中插入一些插入用户的日志。 如果插入此日志消息时发生异常,则应回滚整个事务(即需要再次删除用户)。
.ear部署在Wildfly 8.1上,通过Hibernate与MySQL实现持久化。
我的班级看起来像这样
@Stateless
@Remote(AdministratorBiznesowyService.class)
@Transactional(rollbackOn = Exception.class)
public class AdministratorBiznesowyServiceBean implements AdministratorBiznesowyService {
该方法如下所示
@Override
@Transactional(rollbackOn = Exception.class)
public void insertUser(String userSessionId, User user) throws AdministratorBiznesowyException {
checkPermission(userSessionId);
try {
userBusiness.insertUser(user);
log.insertLog(
authenticationObjectBusiness.getUserIdForSessionId(userSessionId),
LogEnum.CREATE, user);
} catch (AuthenticationException e) {
ServerLogModule.logActionError(Messages
.getErrorMessage("server.authorization.noPermission"));
throw new AdministratorBiznesowyException();
} catch (Exception e1) {
ServerLogModule.logActionError(Messages
.getErrorMessage("server.exception"));
throw new AdministratorBiznesowyException();
}*/
}
userBusiness中的insertUser实现:
@Override
public void insertUser(User user) throws AdministratorBiznesowyException {
try {
UserEntity userEntity = adminConvertUtils.convertUserToEntity(user);
userEntityFacade.create(userEntity);
} catch (Exception e) {
throw new AdministratorBiznesowyException();
}
}
我的log.insertLog目前用于测试目的只会引发异常。
throw new LogException();
它的实现是这样的:
@ApplicationException(rollback=true)
public class LogException extends RuntimeException {
AdministratorBiznesowyException:
@ApplicationException(rollback = true)
public class AdministratorBiznesowyException extends CommunicationException {
的CommunicationException:
public class CommunicationException extends Exception {
所以现在,当我成功调用insertUser并在之后直接获得异常时,新用户仍然会被添加到数据库中(我通过MySQL Workbench查看)。
我还能做些什么才能让它回滚? 如果需要任何其他代码,请提前评论,谢谢。