Menu

No se puede editar un elemento de una coleccion

Larry
2013-12-06
2013-12-11
  • Larry

    Larry - 2013-12-06

    Hola!!!

    Tengo una entidad con llave compuesta y que cuando trato de editar un elemento de una colección en esa entidad, no la actualiza sino que la agrega.

    Gracias Por La Atención Prestada

     
  • Javier Paniza

    Javier Paniza - 2013-12-09

    Hola Larry,

    la combinación de llaves compuestas y colecciones funciona perfectamente con
    OpenXava. El problema tiene que estar en otra parte.

    Pon aquí el código completo de tu entidad principal y la entidad de la colección para que te pueda dar alguna pista.


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

     
  • Larry

    Larry - 2013-12-09

    Anexo las entidades relacionadas

    --------------- Entidad principal ---------------

    package net.grupobit.fenix.model;

    import java.util.*;

    import javax.persistence.*;

    import net.grupobit.fenix.validators.*;

    import org.openxava.annotations.*;

    @Entity
    @Tab(properties="nombre, tipo.nombre", defaultOrder="${codigo} asc")
    @View(members="nombre, tipo; coleccionValoresDominio{valoresDominio};")
    @Table(name="domain")
    public class Dominio {

    @Id
    @SequenceGenerator(name="Dominio_SEQ", sequenceName="domain_code_seq")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="Dominio_SEQ")
    @Column(name="code")
    private Integer codigo;
    
    @Required
    @Column(name="name", length=300)
    private String nombre;
    
    @Required
    @NoCreate
    @NoModify
    @DescriptionsList(descriptionProperties="nombreTraducido", condition="nombre LIKE LOWER('email') or nombre LIKE LOWER('float') or nombre LIKE LOWER('int') or nombre LIKE LOWER('string')")
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="type")    
    private TipoDato tipo;
    
    @OneToMany(mappedBy="dominio", cascade = CascadeType.ALL)   // cascade?
    private Collection<ValorDominio> valoresDominio = new ArrayList<ValorDominio>();
    
    @ListProperties("campo.nombre")
    @OneToMany(mappedBy="dominio", cascade = CascadeType.ALL)
    private Collection<CampoDominio> camposDominio = new ArrayList<CampoDominio>();
    
    public Integer getCodigo() {
        return codigo;
    }
    
    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }
    
    public String getNombre() {
        return nombre;
    }
    
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    
    public TipoDato getTipo() {
        return tipo;
    }
    
    public void setTipo(TipoDato tipo) {
        this.tipo = tipo;
    }
    
    public Collection<ValorDominio> getValoresDominio() {
        return valoresDominio;
    }
    
    public void setValoresDominio(Collection<ValorDominio> valoresDominio) {
        this.valoresDominio = valoresDominio;
    }
    
    public Collection<CampoDominio> getCamposDominio() {
        return camposDominio;
    }
    
    public void setCamposDominio(Collection<CampoDominio> camposDominio) {
        this.camposDominio = camposDominio;
    }
    

    }

    --------------- Entidad de la colección ---------------

    package net.grupobit.fenix.model;

    import javax.persistence.;
    import org.openxava.annotations.
    ;

    @Entity
    @Tab(properties="dominio.codigo, valor", defaultOrder="${dominio.codigo} asc")
    @View(members="#dominio; valor")
    @Table(name="domainvalues")
    @IdClass(ValorDominioKey.class)
    public class ValorDominio {

    @Id
    //@DescriptionsList
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="domain")  
    private Dominio dominio;
    
    @Id
    @Column(name="value", length=300)
    private String valor;
    
    public Dominio getDominio() {
        return dominio;
    }
    
    public void setDominio(Dominio dominio) {
        this.dominio = dominio;
    }
    
    public String getValor() {
        return valor;
    }
    
    public void setValor(String valor) {
        this.valor = valor;
    }
    

    }

    --------------- Clase key ValorDominioKey ---------------

    package net.grupobit.fenix.model;

    import javax.persistence.*;

    public class ValorDominioKey implements java.io.Serializable {

    private String valor;
    
    private Dominio dominio;
    
    @Override
    public boolean equals(Object obj) {
    
        if (obj == null) return false;
        return obj.toString().equals(this.toString());
    
    }
    
    @Override
    public int hashCode() { 
        return toString().hashCode();
    }
    
    @Override
    public String toString() {
        return "ValorDominioKey: " + valor + ":" + dominio.getCodigo();
    }
    
    public String getValor() {
        return valor;
    }
    
    public void setValor(String valor) {
        this.valor = valor;
    }
    
    public Dominio getDominio() {
        return dominio;
    }
    
    public void setDominio(Dominio dominio) {
        this.dominio = dominio;
    }
    

    }

    Gracias Por La Atención Prestada!!

     
  • Federico Alcantara

    Saludos Larry:

    De entrada, con claves compuesta, OX funciona perfectamente. Pero esta es la forma en que lo hacemos:

    1. Las clases referidas en IdClass, también tienen las mismas anotaciones que las clases. Me extraña que JPA (Hibernate) no te disparara una excepción por no tener definida los id en una entidad (ValorDominio).
    2. En cascade CascadeType.REMOVE es el que usamos.

    Espero te sea útil,

    Federico

     
  • Larry

    Larry - 2013-12-11

    Hola!!!

    Aplique la sugerencia que me diste con el CascadeType.REMOVE pero no hubo cambio alguno, he buscado en el libro de openxava que tengo a disposición pero no hay solución alguna a este comportamiento.

    Saludos Federico:
    Me preguntaba puedes hacer el favor de aclararme la respuesta, y decirme a la vez como deberían quedar entonces las entidades corregidas.

     
  • Javier Paniza

    Javier Paniza - 2013-12-11

    Hola Larry,

    te falla porque las claves de ValorDominio están visualizadas en la vista. Si el usuario cambia esos valores, al grabar se está creando un nuevo registro. Clave diferente, objeto diferente. Mi consejo es que uses una clave oculta autogenerada, o bien no permitas que el usuario modifique la clave.


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

     

Log in to post a comment.