web-dev-qa-db-fra.com

Hibernate génère une erreur étrange: la classe n'est pas mappée

c'est l'erreur

org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p]

Je ne comprends pas pourquoi cette erreur est renvoyée, la classe doit être cartographiée comme je vais vous le montrer brièvement. J'ai une configuration très basique, comme celle-ci: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/ch01.html

J'ai essayé d'ajouter la définition de mappage dans hibernate.cfg.xml et j'ai également essayé de l'ajouter par programme. Aucun d'eux n'a travaillé. Quelqu'un pourrait-il me dire ce qui me manque ici? (ce n'est pas la première fois que je monte un projet Hibernate)

c'est le fichier hibernate.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="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/paymentsdatabase</property>
    <property name="hibernate.connection.username">xxx</property>
    <property name="hibernate.connection.password">xxx</property>
    <property name="hibernate.show_sql">true</property>
    <property name="hibernate.current_session_context_class">thread</property>

    <property name="hibernate.hbm2ddl.auto">create</property>

    <!--  <mapping class="com.lsyh.swati.zk.model.Payment"/> -->
  </session-factory>
</hibernate-configuration>

la connexion à la base de données fonctionne bien, j'ai testé cela

c'est l'initialiseur statique dans mon HibernateUtil

static {
    try {

        // Create the SessionFactory from standard (hibernate.cfg.xml) 
        // config file.
        sessionFactory = new AnnotationConfiguration()
            .addPackage("com.lsyh.swati.zk.model")
            .addAnnotatedClass(Payment.class)
            .configure().buildSessionFactory();
    } catch (Throwable ex) {
        // Log the exception. 
        System.err.println("Initial SessionFactory creation failed. " + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

et c’est là que j’utilise la sessionFactory de la classe PaymentIODb:

public static List<Payment> readDataFromDb(){
        StatelessSession session = StoreHibernateUtil.getSessionFactory().openStatelessSession();
        Query query = session.createQuery("select p from Payment p");
        List<Payment> payments = query.list();
        session.close();
        return payments;
}    

c'est la trace de la pile

org.hibernate.hql.ast.QuerySyntaxException: Payment is not mapped [select p from Payment p]
    at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.Java:158)
    at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.Java:87)
    at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.Java:70)
    at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.Java:255)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.Java:3056)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.Java:2945)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.Java:688)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.Java:544)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.Java:281)
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.Java:229)
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.Java:228)
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:160)
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:111)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.Java:77)
    at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.Java:56)
    at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.Java:72)
    at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.Java:133)
    at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.Java:112)
    at com.lsyh.swati.zk.controller.PaymentIODb.readDataFromDb(PaymentIODb.Java:35)
    at com.lsyh.swati.zk.controller.PaymentIODb.resolveVariable(PaymentIODb.Java:20
23
user1100478

Je m'attendrais à l'une des deux raisons suivantes:

  1. soit le paiement ne figure pas dans votre fichier hibernat.cfg.xml, soit vous ne configurez jamais vos classes mappées.

  2. une autre raison pourrait être la confusion entre javax ... Entity et org.hibernate .... Entity. Assurez-vous d'utiliser le premier.

28
Jens Schauder

Au lieu de 

Query query = session.createQuery("select p from Payment p");

essaye ça

Query query = session.createQuery("select p from " + Payment.class.getName() + " p");
28
mprabhat

décommentez le code de mappage commenté dans le fichier de configuration hibernate.cfg.xml

<!--  <mapping class="com.lsyh.swati.zk.model.Payment"/> -->

change it to

<mapping class="com.lsyh.swati.zk.model.Payment"/>

pour plus d'informations référez-vous à ce lien

http://www.javabeat.net/tips/112-configure-mysql-database-with-hibernate-mappi.html

3
sethupathi.t

Bien que la réponse acceptée soit correcte, voudrait ajouter un contexte à la première partie de la réponse. 

Dans votre fichier config.Java (ou ce que vous avez nommé le fichier de configuration de votre application dans des packages), vérifiez que vous avez correctement configuré votre entityScan:

package com.example.config;

import org.springframework.boot.autoconfigure.domain.EntityScan;

@EntityScan("com.example.entities")

Cependant, si vous aimez que notre équipe ait déplacé vos objets dans leurs propres packages, vous pouvez autoriser une analyse de tous les dossiers de packages:

@EntityScan("com.example.*")

Maintenant, toutes les entités ne sont pas spécifiquement dans le dossier Entités.

1
Mindsect Team

Votre bean entité ne sera pas enregistré, je suppose . Définissez le nom correct du paquet racine de vos beans entité dans la propriété packagesToScan . Vérifiez également votre @Table (name = "name_of_y_table").

1
Shyam Yadav

Pour moi, ma classe n'était pas répertoriée dans mon fichier Persistence.xml dans la section classe. 

Faites cela pour résoudre le problème. ou n'importe où vos cours sont listés.

0
lordUhuru