Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

unidades:06_objetos_validaciones:04_listeners [2012/09/07 10:31]
admin [Reglas de negocio]
unidades:06_objetos_validaciones:04_listeners [2016/07/03 20:35] (actual)
Línea 23: Línea 23:
   - En el paquete ''com.fpmislata.persistencia.hibernate.util'' crear la clase ''GenericEventListenerImpl''   - En el paquete ''com.fpmislata.persistencia.hibernate.util'' crear la clase ''GenericEventListenerImpl''
   - En el paquete ''com.fpmislata.persistencia.hibernate.util'' crear la clase ''GenericIntegratorImpl''   - En el paquete ''com.fpmislata.persistencia.hibernate.util'' crear la clase ''GenericIntegratorImpl''
-  - Crear la carpeta ''META-INF.services'' +  - Crear la carpeta ''META-INF'' en el directorio ''src''. 
-  - En la carpeta ''META-INF.services'' crear un fichero con el nombre ''org.hibernate.integrator.spi.Integrator''+  - Dentro de la carpeta ''META-INF'' crea la carpeta ''services'' 
 +  - En la carpeta ''META-INF/services'' crear un fichero con el nombre ''org.hibernate.integrator.spi.Integrator''
   - Añadir al fichero  ''org.hibernate.integrator.spi.Integrator'' el siguiente texto:  ''com.fpmislata.persistencia.hibernate.util.GenericIntegratorImpl''   - Añadir al fichero  ''org.hibernate.integrator.spi.Integrator'' el siguiente texto:  ''com.fpmislata.persistencia.hibernate.util.GenericIntegratorImpl''
  
Línea 208: Línea 209:
  
 <note tip> <note tip>
-En JPA existen anotaciones como <javadoc jee6>javax.persistence.PrePersist</javadoc> que realizan tareas similares. No se han explicado ya que desde hibernate usando el objeto <javadoc h41>org.hibernate.Session|Session</javadoc> no funcionansiendo necesario usar el API específica de JPA que implica usar <javadoc jee6>javax.persistence.EntityManager</javadoc> en vez de <javadoc h41>org.hibernate.Session|Session</javadoc>+Se podría argumentar que el código de los listeners no debería estar en la misma clase que las entidades en ese caso,  sería muy sencillo cambiar el código de ''GenericEventListenerImpl'' para que llamara a otras clases.
 </note> </note>
  
 +<note tip>
 +En JPA existen anotaciones como <javadoc jee6>javax.persistence.PrePersist</javadoc> que realizan tareas similares. No se han explicado ya que desde hibernate usando el objeto <javadoc h41>org.hibernate.Session|Session</javadoc> no funcionan, siendo necesario usar el API específica de JPA que implica usar <javadoc jee6>javax.persistence.EntityManager</javadoc> en vez de <javadoc h41>org.hibernate.Session|Session</javadoc>
 +</note>
 ===== Usando Listeners ===== ===== Usando Listeners =====
 Ya tenemos definido el método que se ejecutará según el evento que hemos establecido. Ahora veamos cómo se utiliza. En el caso del evento //PreInsert// al método se le pasa como argumento un objeto de la clase <javadoc h41>org.hibernate.event.spi.PreInsertEvent|PreInsertEvent</javadoc>. Hay una clase distinta para cada uno de los eventos. Ya tenemos definido el método que se ejecutará según el evento que hemos establecido. Ahora veamos cómo se utiliza. En el caso del evento //PreInsert// al método se le pasa como argumento un objeto de la clase <javadoc h41>org.hibernate.event.spi.PreInsertEvent|PreInsertEvent</javadoc>. Hay una clase distinta para cada uno de los eventos.
  
 Expliquemos ahora los métodos más importantes de la clase <javadoc h41>org.hibernate.event.spi.PreInsertEvent|PreInsertEvent</javadoc> Expliquemos ahora los métodos más importantes de la clase <javadoc h41>org.hibernate.event.spi.PreInsertEvent|PreInsertEvent</javadoc>
 +
 +  * ''Object getEntity()'':
 +Nos retorna el propio objeto que estamos persistiendo.Sobre este objeto deberemos modificar los datos.
 +
   * ''Object[] getState()'':   * ''Object[] getState()'':
-Nos retorna un array con los datos de la entidad. Este array es importantísimo ya que sobre él podremos hacer cambios en los datos y se reflejarán al persistirse. Si hacemos los cambios directamente sobre el objeto no se aplicarán. El problema es que es un array de datos, con lo que necesitamos el índice de cada propiedad.+Nos retorna un array con los datos de la entidad. Este array es importantísimo ya que sobre él deberemos también hacer cambios en los datos y se reflejarán al persistirse. El problema es que es un array de datos, con lo que necesitamos el índice de cada propiedad.
   * ''String[] getPersister().getPropertyNames()'':   * ''String[] getPersister().getPropertyNames()'':
 Esta array nos va a ayudar a saber el índice de una propiedad en función de su nombre. Para ello necesitaremos la siguiente función: Esta array nos va a ayudar a saber el índice de una propiedad en función de su nombre. Para ello necesitaremos la siguiente función:
Línea 266: Línea 274:
     public boolean onPreInsert(PreInsertEvent pie) {     public boolean onPreInsert(PreInsertEvent pie) {
         int propertyNameIndex = getPropertyNameIndex(pie.getPersister().getPropertyNames(), "fechaCreacion");         int propertyNameIndex = getPropertyNameIndex(pie.getPersister().getPropertyNames(), "fechaCreacion");
-        pie.getState()[propertyNameIndex] = new Date();+        Date fechaCreacion=new Date(); 
 +        pie.getState()[propertyNameIndex] = fechaCreacion; 
 +        ((Usuario)(pie.getEntity())).setFechaCreacion(fechaCreacion);
  
         return false;         return false;
Línea 289: Línea 299:
 </code> </code>
  
-  * De las líneas 32 43 está la nueva función ''getPropertyNameIndex'' que hemos creado para ayudarnos.+  * De las líneas 34 48 está la nueva función ''getPropertyNameIndex'' que hemos creado para ayudarnos.
   * En la línea 26 se obtiene el índice de la propiedad ''fechaCreacion''   * En la línea 26 se obtiene el índice de la propiedad ''fechaCreacion''
-  * En la línea 27 modificamos el array con los datos de la entidad estableciendo la fecha. +  * En la línea 27 creamos la fecha que queremos establecer en el objeto. 
-  * En la línea 29 se retorna ''false'' ya que si no se cancelará la operación de inserción.+  * En la línea 28 modificamos el array que contiene los datos de la entidad estableciendo la fecha. 
 +  * En la línea 29 modificamos el objeto estableciendo la fecha. 
 +  * En la línea 31 se retorna ''false'' ya que si no se cancelará la operación de inserción. 
 + 
 +<note tip> 
 +Recuerda que se necesitan cambiar los datos tanto en el objeto ( ''getEntity()'' ) como en el array ( ''getState()'' ). La mejor explicación que he encontrado de ésto ,la puedes ver en [[http://anshuiitk.blogspot.com.es/2010/11/hibernate-pre-database-opertaion-event.html|Hibernate : Pre Database Opertaion Event Listeners]] 
 +</note>
  
 <note warning> <note warning>
 Recuerda siempre retornar ''false'' para que no se cancele la operación. No es recomendable retornar ''true'' para hacer que no se inserte la entidad ya que no se muestra ningún mensaje al usuario. En ese caso es mejor lanzar una excepción. Recuerda siempre retornar ''false'' para que no se cancele la operación. No es recomendable retornar ''true'' para hacer que no se inserte la entidad ya que no se muestra ningún mensaje al usuario. En ese caso es mejor lanzar una excepción.
 </note> </note>
- 
 ===== Reglas de negocio ===== ===== Reglas de negocio =====
 Las reglas de negocio es lo más útil que podemos hacer con los listeners de Hibernate.Veamos los tipos de reglas que podemos implementar: Las reglas de negocio es lo más útil que podemos hacer con los listeners de Hibernate.Veamos los tipos de reglas que podemos implementar:
Línea 319: Línea 334:
   * [[http://www.jboss.org/drools/|Drools - The Business Logic integration Platform]]: Drools es un motor de reglas de negocio.Permite escribir las reglas de nuestras entidades en repositorios de reglas para luego ser llamadas desde nuestra aplicación. Es un proyecto muy importante y complejo aunque poco conocido.   * [[http://www.jboss.org/drools/|Drools - The Business Logic integration Platform]]: Drools es un motor de reglas de negocio.Permite escribir las reglas de nuestras entidades en repositorios de reglas para luego ser llamadas desde nuestra aplicación. Es un proyecto muy importante y complejo aunque poco conocido.
   * [[http://www.automatedbusinesslogic.com|Automated Business Logic.]]: Framework para facilitar la implementación de reglas de negocio.   * [[http://www.automatedbusinesslogic.com|Automated Business Logic.]]: Framework para facilitar la implementación de reglas de negocio.
 +  * [[http://wrschneider.blogspot.com.es/2005/01/avoiding-anemic-domain-models-with.html]]:Avoiding Anemic Domain Models with Hibernate
 +
 ===== Referencias ===== ===== Referencias =====
  
unidades/06_objetos_validaciones/04_listeners.1347006717.txt.gz · Última modificación: 2016/07/03 20:37 (editor externo)
Ir hasta arriba
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0