web-dev-qa-db-fra.com

org.hibernate.MappingException: entité inconnue: annotations.Users

Considérons la hiérarchie: 

enter image description here

Et les classes et XML suivantes: 

HibernateUtil.Java

package annotations;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;


/**
 * 
 * @author X3
 *
 */
public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();
    private static final String HIBERNATE_CFG = "hibernateAnnotations.cfg.xml";

    private static SessionFactory buildSessionFactory() 
    {
        Configuration cfg = new Configuration().addResource(HIBERNATE_CFG).configure();
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
                applySettings(cfg.getProperties()).buildServiceRegistry();
        SessionFactory sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        return sessionFactory;
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Users.Java

package annotations;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import Java.sql.Timestamp;

@Entity
@Table(name = "Users")
public class Users {

    @Id
    @GeneratedValue
    @Column(name = "USER_ID")
    private long userID;

    @Column(name = "USERNAME", nullable = false, length = 100)
    private String username;

    @Column(name = "MessageTimeDate", nullable = false)
    private Java.sql.Timestamp datetime;

    @Column(name = "UserMessage", nullable = false)
    private String message;



    public Users(String username , String message)
    {
        Java.util.Date date = new Java.util.Date();
        this.datetime = new Timestamp(date.getTime());

        this.username = username;
        this.message = message;
    }

    public long getUserID() {
        return userID;
    }

    public void setUserID(long userID) {
        this.userID = userID;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Java.sql.Timestamp getDatetime() {
        return datetime;
    }

    public void setDatetime(Java.sql.Timestamp datetime) {
        this.datetime = datetime;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

Main.Java  

package annotations;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class Main {

    public static void main(String[] args) {

        try
        {
               SessionFactory sf = HibernateUtil.getSessionFactory();
               Session session = sf.openSession();
               session.beginTransaction();

               Users user1 = new Users("Jack" , "Hello");
               session.save(user1);
               session.getTransaction().commit();
               session.close();
        }

        catch (Exception e)
        {
            System.out.println(e.toString());
            e.getStackTrace();
        }


    }
}

Et hibernateAnnotations.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/CHAT_DB</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.pool_size">1</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>
        <mapping class="annotations.Users"></mapping>       
    </session-factory>
</hibernate-configuration>

Lorsque j'exécute main (), l'erreur suivante apparaît dans la fenêtre de sortie: 

org.hibernate.MappingException: Unknown entity: annotations.Users

Mais l'entité Users est dans le paquet annotations, alors qu'est-ce qui ne va pas? 

38
ron

Le fichier de configuration d'Hibernate doit définir les classes d'entité:

<mapping class="annotations.Users"/>

Ou vous devez explicitement ajouter la classe à la configuration en utilisant

configuration.addClass(annotations.Users.class)
// Read mappings as a application resourceName
 // addResource is for add hbml.xml files in case of declarative approach
configuration.addResource("myFile.hbm.xml");  // not hibernateAnnotations.cfg.xml
64
Asif Bhutto

Lorsque j'essayais de réécrire mon exemple (à partir de tutorialspoint) pour utiliser des annotations, j'ai eu la même exception. Cela m'a aidé (addAnnotatedClass ()):

Configuration cfg=new Configuration(); 
cfg.addAnnotatedClass(com.tutorialspoint.hibernate.entity.Employee.class);
cfg.configure();
10
user5728489

Ajoutez ce qui suit à votre XML:

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan">
        <list>
            <value>annotations</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>
7
user2247545

Pour ceux qui utilisent les classes de configuration Java de Spring, vous pouvez écrire ce qui suit:

@Autowired
@Bean(name = "sessionFactory")
public SessionFactory getSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBuilder sessionBuilder = new LocalSessionFactoryBuilder(dataSource);
    sessionBuilder.addProperties(getHibernateProperties());
    sessionBuilder.addAnnotatedClasses(Foo.class);
    sessionBuilder.addAnnotatedClasses(Bar.class);
    sessionBuilder.addAnnotatedClasses(Bat.class);
    return sessionBuilder.buildSessionFactory();
}
5
Marvo

J'avais le même problème. 

Utilisez @javax.persistence.Entity au lieu de org.hibernate.annotations.Entity

5
Shobhit Srivastava

Si votre entité est mappée par des annotations, ajoutez le code suivant à votre configuration.

configuration.addAnnotatedClass(theEntityPackage.EntityClassName.class);

Par exemple;

configuration.addAnnotatedClass(com.foo.foo1.Products.class);

si votre entité est mappée avec un fichier XML, utilisez addClass au lieu de addAnnotatedClass.

Par exemple;

configuration.addClass(com.foo.foo1.Products.class);

Ping moi si vous avez besoin de plus d'aide.

3
Ad Infinitum

Je faisais face au même problème et j'ai cherché pendant près de 2 heures et essayé de différentes manières, comme le remplacement d'anciens JAR en veille prolongée et la modification du schéma de la table de base de données. Mais finalement obtenu la solution ci-dessous:

SessionFactory factory = new Configuration().configure().buildSessionFactory(); //This line to be replaced with below commented line

Remplacer ci-dessus pour

//Configuration config = new Configuration().configure();
//ServiceRegistry servReg = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
//SessionFactory factory = config.buildSessionFactory(servReg);

Cela fonctionnera alors très bien ..

3
JR Sahoo.'JS'

Au lieu d'utiliser HibernateUtil.Java, pour créer un objet sessionfactory, vous devriez utiliser ceci:

SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();

Parce que pour éviter l'exception, vous devez déclarer l'objet de classe dans le fichier HibernateUtil.Java comme étant configuration.addAnnotatedClass(Student_Info.class);, ce qui est bête, car nous avons fourni l'entrée déjà dans le fichier hibernate.cfg.xml.

Pour utiliser la classe AnnotationConfiguration, vous devez ajouter un fichier jar au chemin de génération de votre projet: http://www.Java2s.com/Code/Jar/h/Downloadhibernate353jar.htm

1
Narendra Rawat

J'avais un problème similaire et en ajoutant 

 sessionFactory.setAnnotatedClasses(User.class);

cette ligne a aidé mais avant que je devais 

sessionFactory.setPackagesToScan(new String[] { "com.rg.spring.model" });

Je ne suis pas sûr de savoir pourquoi celui-ci ne fonctionne pas.La classe utilisateur est sous com.rg.spring.model Merci de me faire savoir comment le faire fonctionner via la méthode packagesToScan.

1
Rakesh Goswami
 public static void main(String[] args) {
      try{
        // factory = new Configuration().configure().buildSessionFactory();
         factory = new AnnotationConfiguration().
                   configure().
                   //addPackage("com.xyz") //add package if used.
                   addAnnotatedClass(Employee.class).
                   buildSessionFactory();
      }catch (Throwable ex) { 
         System.err.println("Failed to create sessionFactory object." + ex);
         throw new ExceptionInInitializerError(ex); 
      }//you can write like this in your test class inside main method.this way you will be able to do the things using annotaions only
0
Mithun Debnath

Si vous utilisez la version 5.0x, la configuration avec le registre de service standard est deprecated .

Vous devriez plutôt l’amorcer avec Metadata : Dans votre classe HibernateUtil, vous devriez ajouter

private static SessionFactory buildSessionFactory() {
    try {           
        StandardServiceRegistry standardRegistry = new StandardServiceRegistryBuilder()
            .configure( "hibernate.cfg.xml" )
            .build();

        Metadata metadata = new MetadataSources( standardRegistry )
            .getMetadataBuilder()
            .build();

        return metadata.getSessionFactoryBuilder().build();
    } catch(...) {
        ...
    }
}
0
Sanjay Maredla

Vérifiez que le nom du paquet est donné dans la propriété, packagesToScan dans le dispatcher-servlet.xml 

<bean id="sessionFactory"             class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
        <property name="packagesToScan" value="**entity package name here**"></property> 
        <property name="hibernateProperties">  
            <props>  
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
            </props>  
        </property>  
    </bean>
0
Master Mind

Ajoutez le code suivant à hibernate.cfg.xml

  <property name="hibernate.c3p0.min_size">5</property>
  <property name="hibernate.c3p0.max_size">20</property>
  <property name="hibernate.c3p0.timeout">300</property>
  <property name="hibernate.c3p0.max_statements">50</property>
  <property name="hibernate.c3p0.idle_test_period">3000</property>
0
Sandy

Utilisez EntityScanner si vous pouvez supporter une dépendance externe. Il injectera toutes vos classes d’entités de manière transparente, même à partir de plusieurs packages. Ajoutez simplement la ligne suivante après la configuration.

Configuration configuration = new Configuration().configure();    
EntityScanner.scanPackages("com.fz.epms.db.model.entity").addTo(configuration);
// And following depencency if you are using Maven
<dependency>
        <groupId>com.github.v-ladynev</groupId>
        <artifactId>fluent-hibernate-core</artifactId>
        <version>0.3.1</version>
</dependency>

De cette façon, vous n'avez pas besoin de déclarer toutes les entités dans le fichier de mappage hibernate.

0
M Faisal Hameed