Menu

Acceder objeto padre desde @Embeddable

2016-05-10
2016-05-19
  • Gonzalo Argüello

    Hola, me encuentro ante la siguiente situación.
    Tengo un @ElementCollection con atributos que dependen de un valor específico del padre.
    En el ejemplo Factura - DetalleFactura, tendría que seleccionar el precio unitario del producto en función del tipo de cliente. Lo mismo me sucede con los descuentos por cada ítem.
    ¿Hay alguna manera de que cada vez que se cree un detalle de la factura se le pase la referencia a ésta?

     
  • Javier Paniza

    Javier Paniza - 2016-05-12

    Hola Gonzalo:

    Los elementos de una @ElementCollection son @Embeddable que no tienen referencia al padre, esto es diferente a la @OneToMany. La ventaja es que puedes reutilizar esos @Embeddable en otras entidades, la desventaja es que no puedes poner lógica en el @Embeddable que dependa del padre, porque son de padre desconocido.

    Lo que quiero decir es que no vas a poder usar un @DefaultValueCalculator. Eso no es ningún problema, puedes usar una acción @OnChague para cuando cambie la referencia a producto, desde la acción puedes acceder a la vista y de ahí al cliente.


    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • Gonzalo Argüello

    Hola Javier! Gracias por responder, hice eso exactamente pero me encuentro ante otro problema ahora.
    En la vista principal tengo un campo "PorcentajeDescuento" que al cambiarlo necesito que me recalcule los totales debajo de la @ElementCollection.
    Si coloco @OnChange en PorcentajeDescuento, tan solo al hacer click en "Nuevo" me da error:
    WARNING: ¡ADVERTENCIA! No se ha reaccionado correctamente al cambio de MetaProperty:DetalleCotizacion.view.porcentajeDescuento.

    Es decir, necesito resolver 2 cosas:
    1) Evitar que se ejecute la acción @OnChange de PorcentajeDescuento al quere crear una nueva entidad.
    2) Recalcular los detalles de mi factura cuando cambio el valor de PorcentajeDescuento.

    Gracias de antemano.

     
  • Javier Paniza

    Javier Paniza - 2016-05-16

    Hola Gonzalo:

    1) Evitar que se ejecute la acción @OnChange de PorcentajeDescuento al quere crear una nueva entidad.

    Al pulsar nuevo el valor cambia por lo que el @OnChage salte, eso no lo puedes evitar. Si no ¿que clase de @OnChange sería, que a veces va y a veces no? Tendrás que adaptar la lógica de tu acción para que no falle, se cual sea el valor que reciba.

    2) Recalcular los detalles de mi factura cuando cambio el valor de PorcentajeDescuento.

       getView().refreshCollections();
    

    Ayuda a otros en este foro como yo te ayudo a ti.

     
  • Gonzalo Argüello

    Hola Javier:
    Ante todo, muchas gracias por responder.
    Estoy de acuerdo con tu punto de vista respecto de @OnChange, pero de todas formas produce errores al crear una nueva entidad en donde hay una referencia dentro de un @ElementCollection que está anotada con @OnChange. Lo que ocurre es que se intenta insertar un Map vacío en la posición -1 de un List. De momento lo solucioné agregando la condición || collectionEditingRow == -1 en el método moveViewValuesToCollectionValues() de la clase org.openxava.view.View en la línea 2986 (ver código más abajo).
    Si crees que está bien mi modificación, puedo reportarlo como bug.
    Saludos,

    private void moveViewValuesToCollectionValues() { 
        if (!isRepresentsElementCollection()) {
            View parent = getParent();
            if (parent == null) return;
            parent.moveViewValuesToCollectionValues();
            return;
        }
        if (collectionValues == null  || collectionEditingRow == -1) return;
        if (collectionEditingRow == collectionValues.size()) collectionValues.add(collectionEditingRow, getAllValues());
        else collectionValues.set(collectionEditingRow, getAllValues());        
    }
    
     
  • Javier Paniza

    Javier Paniza - 2016-05-19

    Hola Gonzalo:

    Si crees que está bien mi modificación

    Para saberlo debería lanzar toda la suite de pruebas junit, además de añadir una para el nuevo bug.

    puedo reportarlo como bug

    Sí, por favor.


    Ayuda a otros en este foro como yo te ayudo a ti.

     

Log in to post a comment.