Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

Mostrando entradas con la etiqueta annotation. Mostrar todas las entradas
Mostrando entradas con la etiqueta annotation. Mostrar todas las entradas

Configurar la capa de servicios como transaccionales con spring aop

Existen diversos conceptos que ya voy a dar por conocidos en esta publicación como lo son un advice, un target, un pointcut, un advisor y un aspecto, entre otros. Pero pueden conocer mas en la documentación de referencia sobre aop de Spring (inglés).

http://static.springsource.org/spring/docs/2.5.x/reference/images/tx.png
Conceptualmente una transacción luce como la imagen aqui arriba pero vamos a describir un poco mas el detalle.

Primeramente necesitamos la dependencia de spring-aspects, considerando que nuestro proyecto sea maven, debemos agregar a nuestro pom.xml la siguiente dependencia (por ahora usaremos la ón 2.5.6):
<dependency>
<groupid>org.springframework</groupid>
<artifactid>spring-aspects</artifactid>
<version>2.5.6</version>
</dependency>


Basicamente necesitamos configurar tres elementos, (1) el manejador de las transacciones y su fuente de datos o DataSource, (2) un advice que es el código a ejecutar antes y/o despues de una petición a la base de datos punto central para iniciar-propagar-terminar una transaccion, y finalmente (3) un advisor, que es la relación de dicho advice con un pointcut.

Maven-Spring-Aspectos con @Configurable y Weaving

Porqué la mayoría de la gente usa Load Time Weaving (LTW)? Esto requiere reemplazar el javaagent/classloader para tu JVM el cual batalla con el ordenamiento de todas las cosas.
Echemos un vistazo usando mejor el Compile Time Weaving (CTW).
Este ejemplo usa Spring 2.5.2, AspectJ 1.5.4, Java 1.5 (Spring 2.5.4 usa una version posterior de weaver (3.0 contra 5.0) - Asumo que AspectJ 1.6.0 pero el aspectj-mave-plugin está también basado alrededor de la versión 1.5.4, así que por ahora trabajemos con esta combinación.
En Spring, podemos simplemente inyectar recursos a beans normales de Spring, incluso vía la configuración del contexto de Spring, o usando el soporte para anotaciones basadas en inyecciones ((@Resource, @Autowired junto con @Repository, @Service etc).
Sin embargo, beans que son de alcance prototipo (scope="prototype") son más difíciles de manejar. Estas son renovadas (Bean foo = new FooBean();) incluso por el desarrollador o por frameworks externos o (Hibernate para beans del modelo, contenedores de servlet, etc.).
El sitio spring framework provee la anotación @Configurable para esto.

Hibernate: relaciones con annotations

Ejemplo de anotaciones uni y bidireccional en many-to-one

Tomando en cuenta q hay dos clases (tablas en BD) user y correo de la siguiente forma:

Lo basico:




Tabla USER
Tabla CORREO
ID (id)
NAME (name)
PWD (password)
ID (id)
MAIL (mail)
USER_ID [relacion]

La clase User tendra propiedades id, name, password
La clase Correo tendra propiedades id, mail

Las anotaciones, ademas de los campos arriba mencionados son como sigue:

Bidireccional User --- Correo (User y Correo saben de la existencia del otro)

class Correo {
@ManyToOne(fetch..)
@JoinCloumn(name="USER_ID")
privateUser usuario;
}
class User {
@OneToMany (cascade..,fetch..,mappedBy="usuario")
Set correos;
}

Unidireccional User --> Correo (User sabe q correos tiene pero Correo no sabe nada de User)

class Correo {
/**** no existe ningun atributo 'usuario' ****/
}
class User {
@OneToMany (cascade..,fetch..)
@JoinColumn(name="USER_ID")
Set correos;
}

Unidireccional User <-- Correo (Correo sabe a q user corresponde pero User no sabe nade de Correo) class Correo {
@ManyToOne(fetch..)
@JoinCloumn(name="USER_ID")
privateUser usuario;
}
class User {
**** no existe ningun atributo 'correos' ****
}

NOTA:

mappedBy hace referencia al nombre de atributo del otro lado
* @JoinColumn.name hace referencia al nombre de la tabla en la BD (no el atributo)
* los nombres de las tablas y sus campos aqui se indican en mayusculas, pero las clases Java y sus elementos siguen el mismo esquema q cualquier clase Java.