@Transactional y @Rollback en Spring JDBC

Estoy en un proyecto en el que he abandonado Hibernate. Prefiero tener el control de las queries. Realmente no van a ser unas queries poderosas, pero tambien es cierto que realmente no entiendo la ventaja de Hibernate. Y para colmo no tengo acceso a ningun curso, con el cual pueda abrir los ojos.

He decidido probar Spring JDBC. Uso NamedParameterJdbcTemplate para todas las operaciones. Esto implica no tener que estar inyectando el DataSource por todos los lados. Simplificación y legibilidad.

Con el paso de los días, y en progresión a la experiencia. Decidí hacer test, pero sin grabar en bbdd. Haciendo rollback. Así me queda un proyecto tan completo como los que he realizado con Hibernate. Añadí a mi fichero de configuración de Spring:


    <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />

    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

y en los métodos en los que se hace insert, update ó delete, indico la anotación @Transactional

	@Transactional
	protected void update(String query, T bean) {
	      // ...
	}

Ahora bien, en los test. He estado probando y realizando pruebas para saber concretamente el uso que tiene Transactional y Rollback.

  • Si pones solo Transacctional , hara rollback, cuando se lance alguna excepción no cacheadas (derivadas de RuntimeException). Dentro de la anotación puedes indicarle otras opciones.
  • Si acompañas la anotacion @Transacctional con @Rollback (por defecto es true), estas indicando que siempre se va a hacer Rollback. Mediante la anotacion Rollback, estas sobreescribiendo el comportamiento de Transacctional, referente a los rollback.
  • 	@Test
    	@Transactional
    	@Rollback
    	public void testSave() {
    	      // ...
    	}
    

    Indicar @Transacctional en el metodo de test, es sobreescribir el comportamiento de @Transacctional en el metodo a testear.

El Javadoc de Rollback dice:

Test annotation to indicate whether or not the transaction for the annotated
test method should be rolled back after the test method has
completed. If {@code true}, the transaction will be rolled back;
otherwise, the transaction will be committed.

@Transactional y @Rollback en Spring JDBC

Java Hibernate DDBB, Date

En java tenemos:

  1. el paquete java.util
    • Date: representa el tiempo con precision de milisegundos
    • Calendar: clase abstrapta que provee metodos para convertir instantes de tiempo en un conjunto de campos del calendario.
    • GregorianCalendar: es una clase concreta de Calendar.
  2. el paquete java.sql
    • Date: solo guarda la fecha
    • Time: solo guarda la hora
    • Timestamp: guarda la fecha y la hora

En las bases de datos Oracle tenemos:

  • Date: guarda fecha y hora pero solo con una precision de 1 segundo
  • Time: guarda la hora.
  • Timestamp: guarda fecha y hora.

Si tratas de convertir un tipo de dato SQL.DATE en java.util.Date: tienes que usar la anotacion de JPA: @Temporal que indica que se debe hacer una conversion temporal al tipo (indicado en la anotacion), para tranformarlo al tipo especificado en la clase.

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "FECHA_DATE", nullable = false)
	public java.util.Date getFechaDate() {
		return this.fechaDate;
	}

De esta manera conservamos la fecha y la hora.

Solucion a errores:
jpa-2-0-oracle-date-has-null-time

Java Hibernate DDBB, Date