martes, 12 de marzo de 2013

Hibernate InvalidMappingException

Trabajando con Hibernate, en una relación 1-n bidireccional, obtuve un error en un mapeo

SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource comentario1nbi.hbm.xml
Exception in thread "main" java.lang.NullPointerException
    at com.blog.dao.PostDAO.crearPost(PostDAO.java:48)
    at com.hib.TestHibBlog.main(TestHibBlog.java:26)



Esto surgía, porque en comentario1nb1.hbm.xml había puesto  como name el nombre de la tabla, y debe ser el del VO
 
  <many-to-one name="postVO" column="idPost"  />



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Comentario1nBiVO" table="comentarios1nBi">
  <id name="id" type="int" column="id" >
   <generator class="identity"/>
  </id>
 
  <property name="cuerpo">
   <column name="cuerpo" />
  </property>
  <property name="fecha">
   <column name="fecha"/>
  </property>
 
  <!-- muchos comentarios pertenecen a un post
  indico el nombre del atributo dentro
  de Comentario1nBiVO al cual haré referencia
  con mi clave.
  La columna es la columna de posts, que es clave. -->
  <many-to-one name="postVO" column="idPost"  />
 </class>
</hibernate-mapping>



<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
 <class name="com.blog.vo.Post1nBiVO" table="posts1nBi">
  <id name="id" type="int" column="idPost" >
   <generator class="identity"/>
  </id>

  <property name="idAutor" type="int" column="idAutor"/>

  <property name="fecha">
   <column name="fecha" />
  </property> 
  <property name="titulo">
   <column name="titulo" />
  </property>
  <property name="contenido">
   <column name="contenido"/>
  </property>
 
  <list name="comentarios" cascade="all-delete-orphan">  
     <key column="idPost" /><!-- cuál columna de la tabla post será la clave externa -->
    <index column="ORDEN" />  <!-- para guardar en el mismo orden, una columna nueva -->
    <!-- ahora sí indico que hay una relación de 1 a n -->
    <one-to-many class="com.blog.vo.Comentario1nBiVO" />
  </list>

 </class>
</hibernate-mapping>




package com.blog.vo;

import java.util.Date;

public class Comentario1nBiVO {
        private int id;
        private String fecha;
        private Post1nBiVO postVO;
       
       
        public Comentario1nBiVO() {
            super();
            // TODO Auto-generated constructor stub
        }
        public Comentario1nBiVO(String fecha, String cuerpo) {
            super();
            this.fecha = fecha;
            this.cuerpo = cuerpo;
        }
        private String cuerpo;
        /**
         * @return the id
         */
        public int getId() {
            return id;
        }
        /**
         * @param id the id to set
         */
        private void setId(int id) {
            this.id = id;
        }
       
        /**
         * @return the fecha
         */
        public String getFecha() {
            return fecha;
        }
        /**
         * @param fecha the fecha to set
         */
        public void setFecha(String fecha) {
            this.fecha = fecha;
        }
        /**
         * @return the cuerpo
         */
        public String getCuerpo() {
            return cuerpo;
        }
        /**
         * @param cuerpo the cuerpo to set
         */
        public void setCuerpo(String cuerpo) {
            this.cuerpo = cuerpo;
        }
        /**
         * @return the postVO
         */
        public Post1nBiVO getPostVO() {
            return postVO;
        }
        /**
         * @param postVO the postVO to set
         */
        public void setPostVO(Post1nBiVO postVO) {
            this.postVO = postVO;
        }

       
}




package com.blog.vo;

import java.util.ArrayList;
import java.util.List;

public class Post1nBiVO {

        private int id;
        private int idAutor;
        private String fecha;
        private String titulo;
        private String contenido;
        private List comentarios=new ArrayList();
       
        /**
         * DEBE EXISTIR UN CONSTRUCTOR POR DEFECTO PARA QUE
         * HIBERNATE FUNCIONE
         */
        public Post1nBiVO(){
            super();
        }
       
    public Post1nBiVO(int idAutor, String fecha, String titulo, String contenido) {
        super();
        this.idAutor = idAutor;
        this.fecha = fecha;
        this.titulo = titulo;
        this.contenido = contenido;
    }       
   
    public void addComentario(Comentario1nBiVO comentario){
        comentarios.add(comentario);
    }
       
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

       
        public String getFecha() {
            return fecha;
        }
        public void setFecha(String string) {
            this.fecha = string;
        }
        public String getTitulo() {
            return titulo;
        }
        public void setTitulo(String titulo) {
            this.titulo = titulo;
        }
        public String getContenido() {
            return contenido;
        }
        public void setContenido(String contenido) {
            this.contenido = contenido;
        }

        /**
         * @return the idAutor
         */
        public int getIdAutor() {
            return idAutor;
        }

        /**
         * @param idAutor the idAutor to set
         */
        public void setIdAutor(int idAutor) {
            this.idAutor = idAutor;
        }

        /**
         * @return the comentarios
         */
        public List getComentarios() {
            return comentarios;
        }

        /**
         * @param comentarios the comentarios to set
         */
        public void setComentarios(List comentarios) {
            this.comentarios = comentarios;
        }
       
       
}