11 September 2011

Insersiones múltiples desde un Entity Object

Hay ocasiones en las que se hace necesario que al insertar un registro en una tabla, también se tenga que insertar un registro en otra (como un libro de movimientos), en ciertas ocasiones esto se puede solucionar con trigger en la base de datos, pero hay algunas en las que, por determinadas restricciones esto no es posible.

Para lograr dicho comportamiento, los Entity Objects (EO) disponen de un método llamado doDML (Data Manipulation Language), el cual se invoca cada vez que se realiza un insert, delete y update; el cual es accesible desde el código Java.

Pero ADF se basa en un modelo declarativo por preferencia, es decir si navegamos por el árbol del proyecto solo veremos un fichero XML con el nombre de la tabla; pero cuando necesitamos algún tipo de comportamiento especial, siempre podemos generar una clase con código Java asociado a la tabla e implementar dicho comportamiento.

Para generar el código Java, debemos abrir la entidad y en la pestaña llamada Java debemos crear la implementación, activando la casilla "Data Manipulation Methods".

El secreto para insertar un registro en otra tabla, básicamente reside en obtener la definición(getDefinitionObject) del EO en cuestión, crear una instancia(createInstance2) de este e informar los datos utilizando los setters.

Asi que sabiendo esto, el código para insertar un registro en una tabla adicional, después de haber insertado un registro en nuestro EO, sería algo así como el siguiente:
...
    /**
     * Custom DML update/insert/delete logic here.
     * @param operation the operation type
     * @param e the transaction event
     */
    protected void doDML(int operation, TransactionEvent e) {
      super.doDML(operation, e);
     
      //insert
      if(operation == DML_INSERT){
       
        EntityDefImpl asientoDef = AsientoImpl.getDefinitionObject();
        AsientoImpl asientoNuevo = (AsientoImpl)asientoDef.createInstance2(getDBTransaction(), null);
       
        asientoNuevo.setId(this.getId());
        ...
        ...
        asientoNuevo.setFecha(this.getFecha());
      }
           
    }
...

- FIN -

No comments: