Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.MappingException: Unknown entity

Tags:

I'm trying to work through Beginning Hibernate 2nd edition, and I'm stuck trying to put together the simple working example with HSQLDB.

When I run ant populateMessages, I get

[java] org.hibernate.MappingException: Unknown entity: sample.entity.Message [java]     at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:194) [java]     at org.apache.tools.ant.taskdefs.Java.run(Java.java:747) ... 

Here's what I've got:

Message.java

package sample.entity;  import org.hibernate.annotations.Entity;  import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table;  @Entity public class Message {     private String messageText;     private Integer id;      public Message( String messageText )     {         this.messageText = messageText;     }      public Message()     {     }      public String getMessageText()     {         return messageText;     }      public void setMessageText(String messageText)     {         this.messageText = messageText;     }      @Id     @GeneratedValue     public Integer getId()     {         return id;     }      public void setId(Integer id)     {         this.id = id;     } } 

PopulateMessages.java

package sample;  import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; import org.hibernate.cfg.Configuration; import sample.entity.Message;  import java.util.Date;  public class PopulateMessages {     public static void main(String[] args)     {         SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();         Session session = factory.openSession();         session.beginTransaction();          Message m1 = new Message("Hibernated a  messages on " + new Date());         session.save(m1);         session.getTransaction().commit();         session.close();     } } 

build.properties

# Path to the hibernate install directory hibernate.home=C:/hibernate/hibernate-3.5.6 # Path to the hibernate-tools install directory hibernate.tools.home=C:/hibernate/hibernate-tools # Path to hibernate-tools.jar relative to hibernate.tools.home hibernate.tools.path=/plugins/org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA/lib/tools # Path to hibernate-tools hibernate libraries relative to hibernate.tools.home hibernate.tools.lib.path=/plugins/org.hibernate.eclipse_3.3.1.v201006011046R-H111-GA/lib/hibernate # Path to the SLF4J implementation JAR for the logging framework to use slf4j.implementation.jar=lib/slf4j-simple-1.6.1.jar # Path to the HSQL DB install directory hsql.home=C:/hsqldb 

hibernate.cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.url"> jdbc:hsqldb:file:testdb;shutdown=true </property> <property name="hibernate.connection.driver_class"> org.hsqldb.jdbcDriver </property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password"></property> <property name="hibernate.connection.pool_size">0</property> <property name="hibernate.dialect"> org.hibernate.dialect.HSQLDialect </property> <property name="hibernate.show_sql">false</property> <!-- "Import" the mapping resources here --> <mapping class="sample.entity.Message"/> </session-factory> </hibernate-configuration> 

build.xml

<project name="sample">     <property file="build.properties"/>     <property name="src" location="src"/>     <property name="bin" location="bin"/>     <property name="sql" location="sql"/>     <property name="hibernate.tools"               value="${hibernate.tools.home}${hibernate.tools.path}"/>     <path id="classpath.base">         <pathelement location="${src}"/>         <pathelement location="${bin}"/>         <pathelement location="${hibernate.home}/hibernate3.jar"/>         <pathelement location="${slf4j.implementation.jar}"/>         <fileset dir="${hibernate.home}/lib" includes="**/*.jar"/>         <pathelement location="${hsql.home}/lib/hsqldb.jar"/>   <fileset dir="./lib" includes="**/*.jar"/>     </path> <path id="classpath.tools">     <path refid="classpath.base"/>     <pathelement             location="${hibernate.tools.home}/${hibernate.tools.lib.path}/commons-logging-1.0.4.jar"/>     <pathelement             location="${hibernate.tools}/freemarker.jar"/>     <pathelement             location="${hibernate.tools}/hibernate-tools.jar"/> </path> <taskdef name="htools"          classname="org.hibernate.tool.ant.HibernateToolTask"          classpathref="classpath.tools"/> <target name="exportDDL" depends="compile">     <mkdir dir="${sql}"/>     <htools destdir="${sql}">         <classpath refid="classpath.tools"/>         <annotationconfiguration                 configurationfile="${src}/hibernate.cfg.xml"/>         <hbm2ddl drop="true" outputfilename="sample.sql"/>     </htools> </target> <target name="compile">     <javac srcdir="${src}" destdir="${bin}" classpathref="classpath.base"/> </target> <target name="populateMessages" depends="compile">     <java classname="sample.PopulateMessages" classpathref="classpath.base"/> </target> <target name="listMessages" depends="compile">     <java classname="sample.ListMessages" classpathref="classpath.base"/> </target> 

like image 747
Stefan Kendall Avatar asked Oct 23 '10 00:10

Stefan Kendall


2 Answers

You entity is not correctly annotated, you must use the @javax.persistence.Entity annotation. You can use the Hibernate extension @org.hibernate.annotations.Entity to go beyond what JPA has to offer but the Hibernate annotation is not a replacement, it's a complement.

So change your code into:

import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table;  @Entity public class Message {      ...   }

References

  • Hibernate Annotations Reference Guide
    • 2.4. Hibernate Annotation Extensions
like image 83
Pascal Thivent Avatar answered Sep 29 '22 01:09

Pascal Thivent


You should call .addAnnotatedClass(Message.class) on your AnnotationConfiguration.

If you want your entities to be auto-discovered, use EntityManager (JPA)

(Reference)

Update: it appears you have listed the class in hibernate.cfg.xml. So auto-discovery is not necessary. Btw, try javax.persistence.Entity

like image 39
Bozho Avatar answered Sep 29 '22 01:09

Bozho