Learn how easy it is to sync an existing GitHub or Google Code repo to a SourceForge project! See Demo

Close

Ayuda a un novato, openxava 4.6.1 postgres

2013-01-23
2013-02-06
  • Buenos días, hace un par de dias me decidí a probar este fw basado en el modelo para un pequeño proyecto para un cliente y me he encontrado con pequeños problemas, el war se genera bien, se despliega, esta corriendo contra un postgres y todo, pero me encuentro con que me da una excepcion a la hora de intentar borrar entidades o de mostrar entidades hijas.

    Tengo 3 entidades, Finca, Moroso y ViviendasConDeudas, de forma que Finca y morosa son entidades padre y ViviendasConDeudas es hija de las anteriores.

    A continuacion posteo el codigo de los pojos.

    Finca.java

    package org.openxava.gestion.modelo;

    import java.io.;
    import java.util.
    ;

    import javax.persistence.*;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.Table;

    import org.hibernate.annotations.;
    import org.openxava.annotations.
    ;

    @Entity
    //@Table(name="FINCA", schema="GESTION_FINCAS")
    @Table(name="FINCA")
    public class Finca implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -4674744985418429042L;
    
    public enum TIPO_PARCELA {URBANA,RUSTICA};
    
    @Id @Column(length=20,unique=true) 
    @Required 
    //@Version
    private String refCatastral;
    
    @Column(length=20) 
    @Required
    //@Version
    //@Stereotype("ETIQUETA")
    private String ciudad;
    
    @Column(length=5) 
    @Required
    //@Version
    //@Stereotype("ETIQUETA")
    private String cp;
    
    @Column(length=100) 
    @Required
    //@Version
    @Stereotype("TEXTO_GRANDE")
    private String direccion;
    
    @Column(length=1) 
    @Required
    //@Version
    private TIPO_PARCELA tipoParcela;
    
    @SuppressWarnings("deprecation")
    @CollectionOfElements
    private Collection<ViviendasConDeudas> viviendas = new ArrayList<ViviendasConDeudas>();
    
    public Finca(){
    
    }
    
    public Finca(String refCatastral, String ciudad, String cp,
                String direccion, TIPO_PARCELA tipoParcela,
                Collection<ViviendasConDeudas> viviendas) {
    
        this.refCatastral = refCatastral;
        this.ciudad = ciudad;
        this.cp = cp;
        this.direccion = direccion;
        this.tipoParcela = tipoParcela;
        this.viviendas = viviendas;
    }
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "viviendas", targetEntity=ViviendasConDeudas.class)
    public Collection<ViviendasConDeudas> getViviendas() {
        return viviendas;
    }
    
    public void setViviendas(Collection<ViviendasConDeudas> viviendas) {
        this.viviendas = viviendas;
    }
    
    public String getRefCatastral() {
        return refCatastral;
    }
    
    public void setRefCatastral(String refCatastral) {
        this.refCatastral = refCatastral;
    }
    
    public String getCiudad() {
        return ciudad;
    }
    
    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }
    
    public String getCp() {
        return cp;
    }
    
    public void setCp(String cp) {
        this.cp = cp;
    }
    
    public String getDireccion() {
        return direccion;
    }
    
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    
    public TIPO_PARCELA getTipoParcela() {
        return tipoParcela;
    }
    
    public void setTipoParcela(TIPO_PARCELA tipoParcela) {
        this.tipoParcela = tipoParcela;
    }
    

    }

    Moroso.java

    package org.openxava.gestion.modelo;

    import java.io.;
    import java.util.
    ;

    import javax.persistence.*;
    import javax.persistence.CascadeType;
    import javax.persistence.Entity;
    import javax.persistence.Table;

    import org.hibernate.annotations.;
    import org.openxava.annotations.
    ;

    @Entity
    @Table(name="MOROSO")
    public class Moroso implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -4379659618978530000L;
    
    @Id 
    @Hidden
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "idMoroso", unique = true, nullable = false)
    private Long idMoroso;
    
    @Column(length=9,unique=true) 
    @Required
    //@Version
    //@Stereotype("ETIQUETA")
    private String nifCif;
    
    @Column(length=50) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String direccionAlternativa;
    
    @Column(length=11) 
    //@Version
    @Required
    @Stereotype("TELEFONO")
    private String tlf;
    
    @Column(length=25) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String nombreCompleto;
    
    @SuppressWarnings("deprecation")
    @CollectionOfElements
    private Collection<ViviendasConDeudas> deudas = new ArrayList<ViviendasConDeudas>();
    
    @Column(length=5) 
    //@Version
    @Required
    //@Stereotype("TELEFONO")
    private String cp;
    
    public Moroso(){
    
    }
    
    public Moroso(String nifCif, String direccionAlternativa, String tlf, String nombreCompleto, Collection<ViviendasConDeudas> deudas) {
    
        this.nifCif = nifCif;
        this.direccionAlternativa = direccionAlternativa;
        this.tlf = tlf;
        this.nombreCompleto = nombreCompleto;
        this.deudas = deudas;
    }
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "moroso", targetEntity=ViviendasConDeudas.class)
    public Collection<ViviendasConDeudas> getDeudas() {
        return deudas;
    }
    
    public void setDeudas(Collection<ViviendasConDeudas> deudas) {
        this.deudas = deudas;
    }
    
    public Long getIdMoroso() {
        return idMoroso;
    }
    
    public void setIdMoroso(Long idMoroso) {
        this.idMoroso = idMoroso;
    }
    
    public String getNifCif() {
        return nifCif;
    }
    
    public void setNifCif(String nifCif) {
        this.nifCif = nifCif;
    }
    
    public String getDireccionAlternativa() {
        return direccionAlternativa;
    }
    
    public void setDireccionAlternativa(String direccionAlternativa) {
        this.direccionAlternativa = direccionAlternativa;
    }
    
    public String getTlf() {
        return tlf;
    }
    
    public void setTlf(String tlf) {
        this.tlf = tlf;
    }
    
    public String getNombreCompleto() {
        return nombreCompleto;
    }
    
    public void setNombreCompleto(String nombreCompleto) {
        this.nombreCompleto = nombreCompleto;
    }
    
    public String getCp() {
        return cp;
    }
    
    public void setCp(String cp) {
        this.cp = cp;
    }
    

    }

    ViviendasConDeudas.java

    package org.openxava.gestion.modelo;

    import java.math.;
    import java.sql.
    ;

    import javax.persistence.*;

    import org.openxava.annotations.*;

    @Entity
    @Table(name="VIVIENDASCONDEUDAS")
    public class ViviendasConDeudas implements java.io.Serializable{

    private static final long serialVersionUID = 2904602131284188115L;
    
    @Id 
    @Hidden
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "idDeuda", unique = true, nullable = false)
    private Long idDeuda;
    
    @Column(length=2) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String letra;
    
    @Column(length=50) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String descripcion;
    
    @Column(length=10) 
    //@Version
    @Required
    @Stereotype("FECHAHORA")
    private Timestamp fechaCertificacion;
    
    @Column(length=10) 
    //@Version
    @Required
    @Stereotype("DINERO")
    private BigDecimal montante;
    
    @ManyToOne
    @JoinColumn(name="finca")
    private Finca finca;
    
    @ManyToOne
    @JoinColumn(name="moroso")
    private Moroso moroso;
    
    public ViviendasConDeudas(){
    
    }
    
    public ViviendasConDeudas(String letra, String descripcion,
            Timestamp fechaCertificacion, BigDecimal montante, Finca finca,
            Moroso moroso) {
        this.letra = letra;
        this.descripcion = descripcion;
        this.fechaCertificacion = fechaCertificacion;
        this.montante = montante;
        this.finca = finca;
        this.moroso = moroso;
    }
    
    public Finca getFinca() {
        return finca;
    }
    
    public void setFinca(Finca finca) {
        this.finca = finca;
    }
    
    public Moroso getMoroso() {
        return moroso;
    }
    
    public void setMoroso(Moroso moroso) {
        this.moroso = moroso;
    }
    
    public Long getIdDeuda() {
        return idDeuda;
    }
    
    public void setIdDeuda(Long idDeuda) {
        this.idDeuda = idDeuda;
    }
    
    public String getLetra() {
        return letra;
    }
    
    public void setLetra(String letra) {
        this.letra = letra;
    }
    
    public String getDescripcion() {
        return descripcion;
    }
    
    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }
    
    public Timestamp getFechaCertificacion() {
        return fechaCertificacion;
    }
    
    public void setFechaCertificacion(Timestamp fechaCertificacion) {
        this.fechaCertificacion = fechaCertificacion;
    }
    
    public BigDecimal getMontante() {
        return montante;
    }
    
    public void setMontante(BigDecimal montante) {
        this.montante = montante;
    }
    

    }

    Como pueden apreciar, la entidad hija ViviendasConDeudas tiene un pk autogenerado y fk a las tablas padres. Si voy a la url de la entidad padre finca, al intentar mostrar los datos de la entidad hija ViviendasConDeudas me da la siguiente excepción:

    GRAVE: Imposible buscar por:
    No existe la referencia viviendas en ViviendasConDeudas
    java.rmi.RemoteException: Imposible buscar por:
    No existe la referencia viviendas en ViviendasConDeudas
    at org.openxava.tab.impl.EntityTab.search(EntityTab.java:70)
    at org.openxava.tab.Tab.createTableModel(Tab.java:341)
    at org.openxava.tab.Tab.getTableModel(Tab.java:326)
    at org.apache.jsp.xava.editors.listEditor_jsp._jspService(listEditor_jsp.java:893)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.list_jsp._jspService(list_jsp.java:72)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.editors.collectionEditor_jsp._jspService(collectionEditor_jsp.java:1342)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.collection_jsp._jspService(collection_jsp.java:123)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.detail_jsp._jspService(detail_jsp.java:602)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.core_jsp._jspService(core_jsp.java:297)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:551)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:488)
    at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
    at org.apache.jsp.xava.module_jsp._jspService(module_jsp.java:472)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at org.openxava.web.servlets.ModuleServlet.doGet(ModuleServlet.java:24)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
    at java.lang.Thread.run(Thread.java:680)
    23-ene-2013 11:01:49 org.directwebremoting.util.CommonsLoggingOutput info
    INFO: Exec: Module.getStrokeActions()

    En cambio si voy por la entidad Padre Morosos, SI aparecen perfectamente los datos de la entidad hija. Que estoy haciendo mal? muchas gracias por su paciencia al leer hasta aquí y que pasen un buen día.

    Alonso

     
  • pigbar
    pigbar
    2013-01-23

    Hola,
    Por favor verifica el mapeo de la relacion OnToMany hacia viviendas, sobretodo la clausula mappedBy = "viviendas". Acá enlace de utilidad sobre mapeo JPA http://jin-tallerweb20.blogspot.com/2011/05/jpa-onetomany-manytoone.html

    Por otro lado, en Openxava se aconseja que si anotas una propiedad no debes anotar sus métodos Get. En lo posible considera esa regla.

     
    • Hola, gracias por responder. He leido y aprendido sobre jpa y he modificado los pojos como se sugiere en el blog, desgraciadamente me sigue dando problemas a la hora de actualizar el esquema. Estos son los pojos modificados:

      package org.openxava.gestion.modelo;

      import java.util.*;

      import javax.persistence.*;

      import org.openxava.annotations.*;

      @Entity
      @Views(
      @View(
      name="comunidadvecinos",
      members="DATOS [refCatastral,tipoParcela,ciudad;direccion]"
      )
      )
      @Table(name="COMUNIDADVECINOS")
      public class ComunidadVecinos implements java.io.Serializable{

      /**
       * 
       */
      private static final long serialVersionUID = 44643628377586114L;
      
      public enum TIPO_COMUNIDAD {URBANA,RUSTICA};
      
      @Id @Column(name="REFCATASTRAL",length=20,unique=true,nullable=false) 
      @Required 
      //@Version
      private String refCatastral;
      
      @Column(name="CIUDAD",length=20) 
      @Required
      //@Version
      //@Stereotype("ETIQUETA")
      private String ciudad;
      
      @Column(name="CP",length=5) 
      @Required
      //@Version
      //@Stereotype("ETIQUETA")
      private String cp;
      
      @Column(name="DIRECCION",length=100) 
      @Required
      //@Version
      @Stereotype("TEXTO_GRANDE")
      private String direccion;
      
      @Column(name="TIPO_PARCELA",length=1) 
      @Required
      //@Version
      private TIPO_COMUNIDAD tipoParcela;
      
      @OneToMany(fetch = FetchType.EAGER, 
                 mappedBy = "viviendas", 
                 targetEntity=ViviendasConDeudas.class)
      private Collection<ViviendasConDeudas> viviendas;// = new ArrayList<ViviendasConDeudas>();
      
      getters, setters, toString, hashCode methods...
      

      }

      package org.openxava.gestion.modelo;

      import java.io.;
      import java.util.
      ;

      import javax.persistence.*;

      import org.openxava.annotations.*;

      @Entity
      @Views(
      @View(
      name="comunidadmoroso",
      members="Informacion de morosos [nombreCompleto;nifCif,tlf,cp;direccionAlternativa;];deudas"
      )
      )
      @Table(name="MOROSO")
      public class Moroso implements Serializable{

      /**
       * 
       */
      private static final long serialVersionUID = -4379659618978530000L;
      
      @Id 
      @Hidden
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      @Column(name = "IDMOROSO", unique = true, nullable = false)
      private Long idMoroso;
      
      @Column(name="NIFCIF", length=9,unique=true) 
      @Required
      //@Version
      //@Stereotype("ETIQUETA")
      private String nifCif;
      
      @Column(name="DIRECCION",length=50) 
      //@Version
      @Required
      @Stereotype("TEXTO_GRANDE")
      private String direccion;
      
      @Column(name="TELEFONO", length=11,unique=true) 
      //@Version
      @Required
      @Stereotype("TELEFONO")
      private String tlf;
      
      @Column(name="NOMBRE", length=25) 
      //@Version
      @Required
      @Stereotype("TEXTO_GRANDE")
      private String nombreCompleto;
      
      @OneToMany(fetch = FetchType.EAGER,
                 mappedBy = "deudasVivienda",
                 targetEntity=ViviendasConDeudas.class)
      private Collection<ViviendasConDeudas> deudas;// = new ArrayList<ViviendasConDeudas>();
      
      @Column(name="CP",length=5) 
      //@Version
      @Required
      //@Stereotype("TELEFONO")
      private String cp;
      
      getter, setters, hashCode, toString methods...
      

      }

      y esta es la clase hija de las dos clases anteriores

      package org.openxava.gestion.modelo;

      import java.math.;
      import java.sql.
      ;

      import javax.persistence.*;

      import org.openxava.annotations.*;

      @Entity
      @View(
      members="Viviendas con deudas [descripcion;montante,letra,fechaCertificacion,tipo]"
      )
      @Table(name="VIVIENDASCONDEUDAS")
      public class ViviendasConDeudas implements java.io.Serializable{

      private static final long serialVersionUID = -1711575110204817701L;
      
      public enum TIPOVIVIENDA {PISO,LOCAL};
      
      @Id 
      @Hidden
      @GeneratedValue(strategy=GenerationType.IDENTITY)
      @Column(name = "idDeuda", unique = true, nullable = false)
      private Long idDeuda;
      
      @Column(name="REFCATASTRAL",length=20,unique=false,nullable=false) 
      @Required 
      //@Version
      private String refCatastral;
      
      @Column(name = "IDMOROSO", unique = false, nullable = false)
      private Long idMoroso;
      
      @Column(length=2) 
      //@Version
      @Required
      @Stereotype("TEXTO_GRANDE")
      private String letra;
      
      @Column(length=50) 
      //@Version
      @Required
      @Stereotype("TEXTO_GRANDE")
      private String descripcion;
      
      @Column(length=10) 
      //@Version
      @Required
      @Stereotype("FECHAHORA")
      private Date fechaCertificacion;
      
      @Column(length=10) 
      //@Version
      @Required
      @Stereotype("DINERO")
      private BigDecimal montante;
      
      @Column(length=1) 
      @Required
      private TIPOVIVIENDA tipo;
      
      @ManyToOne(optional=false)
      @JoinColumn(name="REFCATASTRAL",referencedColumnName="REFCATASTRAL",insertable=false,updatable=false)
      @ReferenceView("comunidadvecinos")
      private ComunidadVecinos comunidad;
      
      @ManyToOne(optional=false)
      @JoinColumn(name="IDMOROSO",referencedColumnName="IDMOROSO",insertable=false,updatable=false)
      @ReferenceView("comunidadmoroso")
      private Moroso moroso;
      
      getter, setters, hashCode, toString methods...
      

      }

      Esta es la excepcion:

      Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: org.openxava.gestion.modelo.ViviendasConDeudas.deudasVivienda in org.openxava.gestion.modelo.Moroso.deudas
      at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:685)
      at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:645)
      at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:65)
      at org.hibernate.cfg.Configuration.originalSecondPassCompile(Configuration.java:1716)
      at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1423)
      at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375)
      at org.hibernate.ejb.Ejb3Configuration.buildMappings(Ejb3Configuration.java:1519)
      at org.hibernate.ejb.EventListenerConfigurator.configure(EventListenerConfigurator.java:193)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:1100)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:282)
      at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:366)

      Podria ayudarme por favor?

      gracias

       
  • Ok, gracias por la info, me he dado cuenta del error en el mappedBy, debe coincidir con el nombre del atributo que tiene el detalla. Ahora se genera todo mas o menos bien, salvo por unos detalles.

    No funciona el uso de @Views, por mas que los coloque, la unica colocacion que conoce es el orden en el que estan declarados las columnas en el pojo. Por ahora lo soluciono de esa forma.

    Cuando quiero crear una tupla de la tabla hija ViviendasConDeudas de las dos tablas ComunidadVecinos y Morosos, no me deja. Me explico. Este es el pojo de la tabla hija o de detalle.

    package org.openxava.gestion.modelo;

    import java.math.;
    import java.sql.
    ;

    import javax.persistence.*;

    import org.openxava.annotations.*;

    /
    @View(
    members="Viviendas con deudas [descripcion;montante,letra,fechaCertificacion,tipo]"
    )
    /
    @Entity
    @Table(name="VIVIENDASCONDEUDAS")
    public class ViviendasConDeudas implements java.io.Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -1711575110204817701L;
    
    public enum TIPOVIVIENDA {PISO,LOCAL};
    
    @Id 
    @Hidden
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "idDeuda", unique = true, nullable = false)
    private Long idDeuda;
    
    @Column(length=2) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String letra;
    
    @Column(length=50) 
    //@Version
    @Required
    @Stereotype("TEXTO_GRANDE")
    private String descripcion;
    
    @Column(length=10) 
    @Hidden
    //@Version
    @Required
    @Stereotype("FECHAHORA")
    private Timestamp fechaCertificacion;
    
    @Column(length=10) 
    //@Version
    @Required
    @Stereotype("DINERO")
    private BigDecimal montante;
    
    @Column(length=1) 
    @Required
    private TIPOVIVIENDA tipo;
    
    @ManyToOne(optional=true,fetch=FetchType.LAZY)
    @JoinColumn(name="REFCATASTRAL",referencedColumnName="REFCATASTRAL",insertable=true,updatable=true)
    @ReferenceView("comunidadvecinos")
    private ComunidadVecinos comunidad;
    
    @ManyToOne(optional=true,fetch=FetchType.LAZY)
    @JoinColumn(name="IDMOROSO",referencedColumnName="IDMOROSO",insertable=true,updatable=true)
    @ReferenceView("comunidadmoroso")
    private Moroso moroso;
    

    getter setter, etc..
    }

    Eso deberia crear una tabla con los campos REFCATASTRAL y IDMOROSO nullables y me estoy dando cuenta cuando la veo en el pgadmin que no es asi.

    Ademas en la pagina cuando quiero dar de alta una tupla, no me aparece el dialogo para buscar un moroso o una comunidad. Por lo que no puedo hacer ninguna insercion en esta tabla hija. Raro no? Por lo menos avanzo un poco.

     
  • Javier Paniza
    Javier Paniza
    2013-02-04

    Hola Alonso,

    No funciona el uso de @Views

    Eso no me lo creo. Todas las aplicaciones OpenXava están repletas de @View. ¿Has seguido las instrucciones de la documentación? Pon aquí el código fuente de una entidad con @View que te falle.

    Para los otros dos problemas crea dos nuevos hilos en este foro. Deberiamos crear hilo por cada problema que tengas con un título significativo. Se trata de hacer que el foro sea un herramienta de consulta útil para la comunidad.


    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.

     
  • Hola Javier, siento discrepar, un ejemplo lo tengo cuando visualizo la entidad ComunidadVecinos.

    @Views(
    @View(
    name="comunidadvecinos",
    members="Datos de la comunidad de vecinos [refCatastral,cp,tipoParcela,ciudad;direccion]"
    )
    )
    @Entity
    @Table(name="COMUNIDADVECINOS")
    public class ComunidadVecinos implements java.io.Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 44643628377586114L;
    
    public enum TIPO_COMUNIDAD {URBANA,RUSTICA};
    
    @Id @Column(name="REFCATASTRAL",length=20,unique=true,nullable=false) 
    @Required 
    //@Version
    @Stereotype("RELLENADO_CON_CEROS")
    private String refCatastral;
    
    @Column(name="CIUDAD",length=20) 
    @Required
    //@Version
    //@Stereotype("ETIQUETA")
    private String ciudad;
    
    @Column(name="CP",length=5) 
    @Required
    //@Version
    //@Stereotype("ETIQUETA")
    private String cp;
    
    @Column(name="TIPO_PARCELA",length=1) 
    @Required
    //@Version
    private TIPO_COMUNIDAD tipoParcela;
    
    @Column(name="DIRECCION",length=100) 
    @Required
    //@Version
    @Stereotype("TEXTO_GRANDE")
    private String direccion;
    
    @ReadOnly
    @OneToMany(fetch = FetchType.LAZY, 
               mappedBy = "comunidad", 
               targetEntity=ViviendasConDeudas.class)
    private Collection<ViviendasConDeudas> viviendas = new ArrayList<ViviendasConDeudas>();
    

    getters, setters, toString, hashcode methods...

    tal y como lo tengo declarado con la etiquete Views, deberia verse lo siguiente:

    en una misma linea los campos refCatastral, cp, tipoParcela y ciudad, en la siguiente linea el campo direccion.
    Si le doy a nuevo, la pantalla genera SI toma en cuenta la declaracion del @View y los campos aparecen en ese orden, en cambio, en la pantalla de busqueda, el orden de los campos es el orden de los atributos de los pojos, en este caso refCatastral, ciudad, cp,tipoParcela y por ultimo direccion.

    A ver, ahora que conozco un poco mas el sistema, no es grave, ocurre que no lo entiendo. Gracias por tu ayuda

     
  • pigbar
    pigbar
    2013-02-05

    Hola Alonso,
    Primero por favor revisa bien la sintaxis de la anotación @Views pues la estas empleando en forma indebida.
    En segundo lugar en las vistas no uses identificadores que contengan espacios tales como "Datos de la comunidad de vecinos", usa un identificador clave como DatosVecinos y en los archivos de i18n apropiados creas el par clave valor adecuado con el mensaje que deseas.

    Saludos cordiales

     
  • Javier Paniza
    Javier Paniza
    2013-02-06

    Hola Alonso,

    en cambio, en la pantalla de busqueda, el orden de los campos es

    Claro, porque la vista por defecto (la que no tiene nombre) no se utiliza para el formulario de búsqueda. Esto es así porque normalmente la vista por defecto visualiza todos los datos de la entidad, normalmente en carpetas y con eventos al cambiar u otro tipo de lógica, mientras que el formulario de búsqueda suele ser más simple, sin carpetas, sin eventos y con las propiedades más útiles para buscar.

    Para definir la vista para buscar has de darle el nombre "Search" o "Simple". Leete la documentación del wiki, especialmente donde explica name de @View, allí menciona lo de la vista Search.

    Dicho con código:

    @Views({
        @View(members="a, b, c; section1 { a1; b1, c1}"), // Vista por defecto
        @View(name="Search", members="a, b, c") // Vista usada para buscar
    })
    

    Ayuda a otros en este foro como yo te ayudo a ti.
    Antes de poner una pregunta busca en este mismo foro la respuesta
    y lee la documentación de OpenXava en openxava.org.