23

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>

1
  • 1
    +1 For the detailed question. I have encountered the same problem and and looking at your hibernate.cfg.xml showed me my problem. Commented Feb 28, 2014 at 12:19

12 Answers 12

37

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

Sign up to request clarification or add additional context in comments.

5 Comments

ah, the Note about Entity being mandatory is new to me (I've never used the hibernate annotation). I spotted that piece (see my update), but wasn't sure it is the answer :) (+1)
@Bozho Can't say about the note but I'm sure that hibernate annotation has always been a complement, not a replacement. +1 for your update too then.
I'll test. I never, ever would have caught this.
@Stefan Well, that's a vicious issue and I detected it during an Nth scan of the code after chatting with Bozho. Actually, it's writing things that gave me an idea of what the problem could be.
But what if the required class that is an entity is from another library? Is there a way around using @Entity?
12

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

6 Comments

No, the OP shouldn't have to do that, the entity is declared in the hibernate.cfg.xml.
@Pascal Thivent hmm, missed that line. Then it is strange, since by default the Configuration.configure() looks for hibernate.cfg.xml
Yeah I agree, this is strange. I would expect things to fail totally (the .cfg.xml is not found), not "partially". Activating logging might help but I'm too lazy to set up an Ant build to reproduce :)
LOL, I spotted the problem :)
@Pascal Thivent and it is? :)
|
1

In case if you get this exception in SpringBoot application even though the entities are annotated with Entity annotation, it might be due to the spring not aware of where to scan for entities

To explicitly specify the package, add below

@SpringBootApplication
@EntityScan({"model.package.name"})
public class SpringBootApp {...}

note: If you model classes resides in the same or sub packages of SpringBootApplication annotated class, no need to explicitly declare the EntityScan, by default it will scan

Comments

1

Use below line of code in the case of Spring Boot Application Add in Spring Boot Main Class @EntityScan(basePackageClasses=YourClassName.class)

Comments

1

use below line of code in the case of spring boot applications.

@EntityScan(basePackageClasses=YourClassName.class)

Comments

0

you should add all the entity files in the .addAnnotatedClass(Class) method, if the class needs to be auto discovered.

use this link, it might help..

http://docs.jboss.org/hibernate/stable/core/api/org/hibernate/cfg/AnnotationConfiguration.html

Comments

0

I encountered the same problem when I switched to AnnotationSessionFactoryBean. I was using entity.hbm.xml before.

I found that My class was missing following annotation which resolved the issue in my case:

@Entity
@Table(name = "MyTestEntity")
@XmlRootElement

Comments

0

Use import javax.persistence.Entity; Instead of import org.hibernate.annotations.Entity;

Comments

0

My issue was resolved After adding
sessionFactory.setPackagesToScan( new String[] { "com.springhibernate.model" }); Tested this Functionality in spring boot latest version 2.1.2.

Full Method:

 @Bean( name="sessionFactoryConfig")
    public LocalSessionFactoryBean sessionFactoryConfig() {

        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

        sessionFactory.setDataSource(dataSourceConfig());
        sessionFactory.setPackagesToScan(
                new String[] { "com.springhibernate.model" });

        sessionFactory.setHibernateProperties(hibernatePropertiesConfig());

        return sessionFactory;
    }

Comments

0

You can enable entity scan by adding below annotation on Application .java @EntityScan(basePackageClasses=YourEntityClassName.class)

Or you can set the packageToScan in your session factory. sessionFactory.setPackagesToScan(“com.all.entity”);

Comments

0

check that entity is defined in hibernate.cfg.xml or not.

Comments

-2

In hibernate.cfg.xml , please put following code

<mapping class="class/bo name"/>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.