2009-06-09 7 views
7

J'essaie de faire fonctionner l'exemple de la référence Hibernate.Erreur Hibernate: impossible de résoudre la table

J'ai un élève de table simple avec des champs identifiant, nom et âge. J'ai créé la bonne classe (comme je pense) java-class selon toutes les règles java-beans.

J'ai créé le fichier de configuration - hibernate.cfg.xml, comme dans l'exemple de la référence.

J'ai créé le mappage d'hibernation pour un élève de classe, et voici l'erreur qui s'est produite. Table = "pupilles" est rouge dans mon EDI et le message "ne peut pas résoudre les pupilles de la table" s'affiche. J'ai également fondé une note très étrange dans la référence qui dit que la plupart des utilisateurs échouent avec le même problème en essayant d'exécuter l'exemple.

Ah .. Je suis très en colère contre cet exemple .. À mon humble avis si les auteurs savent qu'il existe un tel problème, ils devraient ajouter quelques informations à ce sujet.

Mais, comment dois-je résoudre le problème? Je ne veux pas traiter avec Ant ici et avec d'autres instruments utilisés dans l'exemple. J'utilise MySQL 5.0, mais je pense que cela n'a pas d'importance.

UPD: code source

Pupil.java - ma classe persistante

package domain; 

public class Pupil { 
    private Integer id; 
    private String name; 
    private Integer age; 

    protected Pupil() { } 

    public Pupil (String name, int age) { 
     this.age = age; 
     this.name = name; 
    } 

    public Integer getId() { 
     return id; 
    } 

    public void setId (Integer id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName (String name) { 
     this.name = name; 
    } 

    public Integer getAge() { 
     return age; 
    } 

    public void setAge (Integer age) { 
     this.age = age; 
    } 

    public String toString() { 
     return "Pupil [ name = " + name + ", age = " + age + " ]"; 
    } 
} 

Pupil.hbm.xml est la cartographie de cette classe

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping package="domain" > 

    <class name="Pupil" table="pupils"> 
     <id name="id"> 
      <generator class="native" /> 
     </id> 
     <property name="name" not-null="true"/> 
     <property name="age"/> 
    </class> 
</hibernate-mapping> 

hibernate.cfg.xml - configuration pour hiberner

<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://localhost/hbm_test</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.MySQL5Dialect</property> 
     <property name="current_session_context_class">thread</property> 
     <property name="show_sql">true</property> 

     <mapping resource="domain/Pupil.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 

HibernateUtils.java

package utils; 

import org.hibernate.SessionFactory; 
import org.hibernate.HibernateException; 
import org.hibernate.cfg.Configuration; 

public class HibernateUtils { 
    private static final SessionFactory sessionFactory; 

    static { 
     try { 
      sessionFactory = new Configuration().configure().buildSessionFactory(); 
     } catch (HibernateException he) { 
      System.err.println (he); 
      throw new ExceptionInInitializerError (he); 
     } 
    } 

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

Runner.java - classe pour les tests mise en veille prolongée

import org.hibernate.Session; 

import java.util.*; 

import utils.HibernateUtils; 
import domain.Pupil; 

public class Runner { 
    public static void main (String[] args) { 
     Session s = HibernateUtils.getSessionFactory().getCurrentSession(); 

     s.beginTransaction(); 
     List pups = s.createQuery ("from Pupil").list(); 
     for (Object obj : pups) { 
      System.out.println (obj); 
     } 
     s.getTransaction().commit(); 

     HibernateUtils.getSessionFactory().close(); 
    } 
} 

Mes libs: antlr-2.7.6.jar, asm.jar, asm-attrs .jar, cglib-2.1.3.jar, commons-collections-2.1.1.jar, commons-journalisation-1.0.4.jar, dom4j-1.6.1.jar, hibernate3.jar, jta.jar, log4j-1.2 .11.jar, mysql-connector-java-5.1.7-bin.jar

Compile error: cannot resolve table pupils

+0

ide? outils jboss? avez-vous besoin de configurer les informations de connexion dans les préférences des outils jboss? – Surya

+0

IntelliJ IDEA 7, Hibernate 3.2, jdk 1.6. Attendez, je vais ajouter le code – Roman

Répondre

17

Cela n'a rien à voir avec Hibernate, c'est un "problème" IDEA et vous devez le configurer correctement pour la validation des noms de tables dans hbm.xml.De this old thread:

In order for IntelliJ to provide proper code completion and validation for database tables/columns, it needs to know about the database structure of your application as well. So, I'm referring to the IntelliJ datasource. Think of it as a "development-time datasource", or something like that.

To create one:
Window -> Tool Windows -> Data sources
Add ("plus" icon) -> JDBC data source

As an alternative, you could try the "Import" button in the "Date sources" tool window. This makes IntelliJ search your project for some specific configuration files (like "hibernate.cfg.xml"), from which it can directly import a datasource definition.

However, if that fails, you can always define a JDBC data source manually (jdbc url, driver jar, driver class, etc).

Once you have a datasource configured, test it by opening an SQL console on it ("console" button in datasource tool window), and type some queries. IDEA should provide SQL code completion here, for table and column names.

If this step works, go to the definition of the datasource, and invoke

"Refresh Tables". This makes IntelliJ retrieve the database structure.

Next, open "Project Structure" (Ctrl-Shift-Alt-S). Select your Hibernate facet (though either "Facets" or "Modules").

The options screen for the Hibernate facet has a pane named "DataSources Mapping". Here you can associate your Hiberante session factory with a specific IntelliJ datasource.

After this step, SQL table/column code completion and validation should work in .hbm files as well.

applique à IDEA 7 également, lire tout le fil si nécessaire.

+0

J'ai déjà trouvé la même réponse (comme vous pouvez le voir, la question a été posée il y a presque un an). Mais de toute façon c'est correct. – Roman

+0

@Roman Pas de problème :) En fait, l'utilisateur "Communauté" a répondu à cette question ce matin, c'est pourquoi j'ai posté une réponse. Oh, et dans ce cas, si vous trouvez une solution, n'hésitez pas à poster votre propre réponse et à l'accepter. –

1

Nous avons besoin de beaucoup plus d'informations pour vous aider.

Est-ce une application de ligne de commande? Quelle erreur d'exécution est donnée? Quel IDE utilisez-vous? Quelle est la sortie de l'activation de la journalisation de débogage d'hibernate?

+0

C'est l'erreur de compilation, IDE est IntelliJ IDEA, et il devrait être un problème célèbre que je comprends de la référence. – Roman

+0

S'il vous plaît répondre aux autres questions afin que nous puissions vous aider. Et concernant votre erreur: ce n'est pas du code compilé: le fichier .cfg.xml est simplement un fichier de configuration. Peut-être que si vous liez à l'échantillon que vous utilisez? – DarkSquid

+0

En fait, je ne sais pas comment vous montrer le code. Je suis presque sûr que le code est bien et le problème avec certains paramètres (ou peut-être j'ai perdu un fichier Jar nessecary). Je vais essayer d'ajouter quelque chose – Roman

1

Votre EDI vous dit qu'il ne trouve pas la table. Vous pouvez le remplacer par un avertissement dans IDEA afin que votre projet soit au moins compilé.

0

Pour valider un mappage de fichiers hbm.xml, procédez comme suit (Intellij ultime 2017,1):

View -> Tool Windows -> Database -> click (+) sign -> Data Source -> MySQL 

Vous avez ajouté une source de données pour le serveur de votre base de données. Maintenant, vous devriez créer la source de données. L'étape suivante consiste à ajouter cette source de données aux mises en veille hibernées. Suivez-moi simplement:

View -> Tool Windows -> Persistence 

La fenêtre de persistance sera ouverte. Vous devez voir le projet répertorié. Dans la fenêtre ouverte, il devrait y avoir 2 colonnes: "Session Factory" et "Data Source". Ajoutez simplement la source de données définie ci-dessus dans la deuxième colonne.

Questions connexes