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>
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 { ... }
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With