我试图在某些方法中无法自动提交以使它们成为事务性的。我使用spring JDBC Template。
我尝试使用de @Transactional注释,但另一个依赖于此的Web应用程序停止正常工作,所以我尝试了不同的东西。我试图从模板获取连接,并手动将自动提交设置为false。
问题是,我认为它根本不是残疾人。我有一个insert方法,并在最后,为了测试,我做一个回滚而不是提交。
在JUnit测试中,我尝试恢复具有不存在的Id的对象,它不返回任何内容。然后我用该Id创建一个对象,并尝试插入它。它应该不返回任何内容,因为insert方法执行回滚,但它返回我插入的对象。
这是一些代码。
数据源bean:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<property name="resourceRef" value="true" />
</bean>
执行插入的DAO中的数据源声明:
@Autowired
public final void setDataSource(final DataSource pDataSource) {
this.jdbcTemplate = new JdbcTemplate(pDataSource);
}
插入方法:
public final void insertProcedimiento(final Procedimiento pProcedimiento) throws DataManipulationException, SQLException {
/**
* Se obtiene la conexión a partir del DataSource.
*/
final DataSource ds = jdbcTemplate.getDataSource();
final Connection conexion = DataSourceUtils.getConnection(ds);
try {
//Se establece el AutoCommit como false para hacer rollback en caso de que haya algún error al insertar el procedimiento
conexion.setAutoCommit(false);
// Instanciación del template de JDBC
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(ds);
// Inicializar el objeto que contendrá los parámetros de la query
this.namedParameters = new HashMap<String, Object>();
final String query = (
"INSERT INTO DEX_PROCEDIMIENTO(PRO_CODIGO_INTERNO,PRO_CODIGO_SIA,PRO_TIPO_TRAMITE,PRO_INTERNO,PRO_ES_COMUN,PRO_DENOMINACION,PRO_DESCRIPCION,PRO_OBSERVACIONES,PRO_COD_ORG_RESPONSABLE_N1,"
+ "PRO_COD_ORG_RESPONSABLE_N2,PRO_UNIDAD_GESTORA_TRAMITE,PRO_COD_ORGANICA,PRO_SUJETO_TASAS,PRO_PERIODICIDAD,PRO_COD_CLASE_TRAMITE,PRO_CLASIFICACION_ARCHIVO,PRO_REQUISITOS_INICIACION,"
+ "PRO_PRESENCIAL_NO_ADAPTABLE,PRO_COD_NIVEL_AE,PRO_COD_REQUISITOS_IDENT_PJ,PRO_COD_REQUISITOS_IDENT_PF,PRO_ID_INTEGRADO_CLAVE,PRO_OBS_INTEGRADO_CLAVE,PRO_ENLACE_WEB,PRO_PORTAL,"
+ "PRO_FORMA_INI_INTERESADO,PRO_COD_SILENCIO_INTERESADO,PRO_FORMA_INI_OFICIO,PRO_COD_SILENCIO_OFICIO,PRO_NUMERO_PLAZO_RESOLUCION,PRO_COD_TIPO_PLAZO_RESOLUCION,PRO_FIN_VIA,PRO_PROCEDIMIENTO_AUTORIZACION,"
+ "PRO_RESPONSABLE,PRO_VISIBLE_CIUDADANO,PRO_FECHA_VISIBLE_CIUDADANO,PRO_RESPONSABLE_TECNICO,PRO_FECHA_ALTA,PRO_FECHA_MODIFICACION,PRO_USUARIO_MODIFICACION,PRO_ESTADO)"
+ "VALUES(:iProCodigoInterno, :iProCodigoSia, :sProTipoTramite, :sProInterno, :sProEsComun, :sProDenominacion, :sProDescripcion, :sProObservaciones, :sProCodOrgResponsableN1, :sProCodOrgResponsableN2, "
+ ":sProUnidadGestoraTramite, :iProCodOrganica, :sProSujetoTasas, :iProPeriodicidad, :iProCodClaseTramite, :sProClasificacionArchivo, :sProRequisitosIniciacion, :sProPresencialNoAdaptable, :iProCodNivelAe, "
+ ":sProCodRequisitosIdenPj, :sProCodRequisitosIdenPf, :sProIdIntegradoClave, :sProObsIntegracionClave, :sProEnlaceWeb, :iProPortal, :sProFormaIniInteresado, :iProCodSilencioInteresado, :sProFormaIniOficio, "
+ ":iProCodSilencioOficio, :iProNumeroPlazoResolucion, :iProCodTipoPlazoResolucion, :sProFinVia, :iProProcedimientoAutorizacion, :sProResponsable, :sProVisibleCiudadano, :dProFechaVisibleCiudadano, "
+ ":sProResponsableTecnico, :dProFechaAlta, :dProFechaModificacion, :sProUsuarioModificacion, :sProEstado)");
namedParameters.put("iProCodigoInterno", pProcedimiento.getProCodigoInterno());
namedParameters.put("iProCodigoSia", pProcedimiento.getProCodigoSia());
namedParameters.put("sProTipoTramite", pProcedimiento.getProTipoTramite());
namedParameters.put("sProInterno", pProcedimiento.getProInterno());
namedParameters.put("sProEsComun", pProcedimiento.getProEsComun());
namedParameters.put("sProDenominacion", pProcedimiento.getProDenominacion());
namedParameters.put("sProDescripcion", pProcedimiento.getProDescripcion());
namedParameters.put("sProObservaciones", pProcedimiento.getProObservaciones());
namedParameters.put("sProCodOrgResponsableN1", pProcedimiento.getProCodOrgResponsableN1());
namedParameters.put("sProCodOrgResponsableN2", pProcedimiento.getProCodOrgResponsableN2());
namedParameters.put("sProUnidadGestoraTramite", pProcedimiento.getProUnidadGestoraTramite());
namedParameters.put("iProCodOrganica", pProcedimiento.getProCodOrganica());
namedParameters.put("sProSujetoTasas", pProcedimiento.getProSujetoTasas());
namedParameters.put("iProPeriodicidad", pProcedimiento.getProPeriodicidad());
namedParameters.put("iProCodClaseTramite", pProcedimiento.getProCodClaseTramite());
namedParameters.put("sProClasificacionArchivo", pProcedimiento.getProClasificacionArchivo());
namedParameters.put("sProRequisitosIniciacion", pProcedimiento.getProRequisitosIniciacion());
namedParameters.put("sProPresencialNoAdaptable", pProcedimiento.getProPresencialNoAdaptable());
namedParameters.put("iProCodNivelAe", pProcedimiento.getProCodNivelAe());
namedParameters.put("sProCodRequisitosIdenPj", pProcedimiento.getProCodRequisitosIdenPj());
namedParameters.put("sProCodRequisitosIdenPf", pProcedimiento.getProCodRequisitosIdenPf());
namedParameters.put("sProIdIntegradoClave", pProcedimiento.getProIdIntegradoClave());
namedParameters.put("sProObsIntegracionClave", pProcedimiento.getProObsIntegracionClave());
namedParameters.put("sProEnlaceWeb", pProcedimiento.getProEnlaceWeb());
namedParameters.put("iProPortal", pProcedimiento.getProPortal());
namedParameters.put("sProFormaIniInteresado", pProcedimiento.getProFormaIniInteresado());
namedParameters.put("iProCodSilencioInteresado", pProcedimiento.getProCodSilencioInteresado());
namedParameters.put("sProFormaIniOficio", pProcedimiento.getProFormaIniOficio());
namedParameters.put("iProCodSilencioOficio", pProcedimiento.getProCodSilencioOficio());
namedParameters.put("iProNumeroPlazoResolucion", pProcedimiento.getProNumeroPlazoResolucion());
namedParameters.put("iProCodTipoPlazoResolucion", pProcedimiento.getProCodTipoPlazoResolucion());
namedParameters.put("sProFinVia", pProcedimiento.getProFinVia());
namedParameters.put("iProProcedimientoAutorizacion", pProcedimiento.getProProcedimientoAutorizacion());
namedParameters.put("sProResponsable", pProcedimiento.getProResponsable());
namedParameters.put("sProVisibleCiudadano", pProcedimiento.getProVisibleCiudadano());
namedParameters.put("dProFechaVisibleCiudadano", pProcedimiento.getProFechaVisibleCiudadano());
namedParameters.put("sProResponsableTecnico", pProcedimiento.getProResponsableTecnico());
namedParameters.put("dProFechaAlta", pProcedimiento.getProFechaAlta());
namedParameters.put("dProFechaModificacion", pProcedimiento.getProFechaModificacion());
namedParameters.put("sProUsuarioModificacion", pProcedimiento.getProUsuarioModificacion());
namedParameters.put("sProEstado", pProcedimiento.getProEstado());
// Mapear los parámetros de la query almacenados en el HashMap
final SqlParameterSource params = new MapSqlParameterSource(namedParameters);
// Ejecutar la query y lanzar excepción en caso de fallo
try {
namedParameterJdbcTemplate.update(query, params);
} catch (final DataAccessException exDA) {
LOGGER.error("Error al insertar procedimiento: " + exDA.getMessage());
throw new DataManipulationException("Error al insertar procedimiento: " + exDA.getMessage());
}
//Here I should do the conexion.commit()
conexion.rollback();
} catch (SQLException | DataManipulationException e) {
//Se hace el rollback de los cambios
conexion.rollback();
}
}
为什么autocommit(false)不工作?
提前致谢!