web-dev-qa-db-fra.com

org.hibernate.MappingException: entité inconnue

J'essaie de travailler sur la deuxième édition de Beginning Hibernate, et je suis coincé pour essayer de créer un exemple de travail simple avec HSQLDB.

Quand je lance ant populateMessages, je reçois

[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)
...

Voici ce que j'ai

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>

22
Stefan Kendall

Votre entité n'est pas correctement annotée, vous devez utiliser l'annotation @javax.persistence.Entity . Vous pouvez utiliser l'extension Hibernate @org.hibernate.annotations.Entity pour aller au-delà de ce que JPA peut offrir, mais l'annotation Hibernate n'est pas un remplacement, c'est un complément.

Alors changez votre code en:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
public class Message { 
    ...  
}

Références

33
Pascal Thivent

Vous devriez appeler .addAnnotatedClass(Message.class) sur votre AnnotationConfiguration.

Si vous voulez que vos entités soient auto-découvertes, utilisez EntityManager (JPA)

( Référence )

Mise à jour: il semble que vous ayez répertorié la classe dans hibernate.cfg.xml. La découverte automatique n'est donc pas nécessaire. Btw, essayez javax.persistence.Entity

12
Bozho

Mon problème a été résolu après avoir ajouté
sessionFactory.setPackagesToScan ( new String [] {"com.springhibernate.model"}); Testé cette fonctionnalité au printemps dernière version 2.1.2.

Méthode complète:

 @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;
    }
0
Santosh Reddy

Utilisez la ligne de code ci-dessous dans le cas de l'application d'amorçage Spring Ajoutez-la à la classe principale d'amorçage Spring @EntityScan (basePackageClasses = YourClassName.class)

0
JavaDev

Utilisezimport javax.persistence.Entity; Au lieu deimport org.hibernate.annotations.Entity;

0
Akanksha

vous devez ajouter tous les fichiers d'entité à la méthode .addAnnotatedClass (Class), si la classe doit être découverte automatiquement.

utilisez ce lien, cela pourrait aider ..

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

0
M.J.

utiliser la ligne de code ci-dessous dans le cas d'applications à démarrage par ressort. 

@EntityScan (basePackageClasses = YourClassName.class)

0
JavaDev

J'ai rencontré le même problème lorsque je suis passé à AnnotationSessionFactoryBean. J'utilisais entity.hbm.xml avant.

J'ai trouvé qu'il manquait ma classe à l'annotation suivante, ce qui a résolu le problème dans mon cas:

@Entity
@Table(name = "MyTestEntity")
@XmlRootElement
0
Sanjay Ingole

Si vous obtenez cette exception dans l'application SpringBoot alors que les entités sont annotées avec une annotation Entity, il se peut que le printemps ne sache pas où rechercher les entités.

Pour spécifier explicitement le package, ajoutez ci-dessous

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

remarque: Si vos classes de modèle résident dans le même ou dans des sous-packages de la classe annotée SpringBootApplication, il n'est pas nécessaire de déclarer explicitement la EntityScan. Par défaut, elle sera analysée.

0
Saravana