2009-06-09 5 views
7

nicht auflösen Ich versuche, Arbeit das Beispiel aus Hibernate-Referenz zu machen.Hibernate-Fehler: kann Tabelle

Ich habe einfache Tabelle Schüler mit ID, Name und Alter Felder. Ich habe die korrekte (wie ich denke) Java-Klasse dafür nach allen Java-Beans-Regeln erstellt.

Ich habe Konfigurationsdatei erstellt - hibernate.cfg.xml, genau wie im Beispiel aus Referenz.

Ich habe Hibernate Mapping für eine Klasse Schüler erstellt, und hier ist der Fehler aufgetreten.

table = "Schüler" ist rot in meiner IDE und ich sehe Nachricht "kann Tabelle Schüler nicht auflösen". Ich habe auch sehr seltsame Anmerkung in der Referenz gegründet, die besagt, dass die meisten Benutzer mit dem gleichen Problem fehlschlagen, das versucht, das Beispiel auszuführen.

Ah .. Ich bin sehr sauer auf dieses Beispiel .. IMHO, wenn Autoren wissen, dass es ein solches Problem gibt, sollten sie einige Informationen darüber hinzufügen.

Aber wie soll ich es beheben? Ich möchte hier nicht mit Ant und mit anderen im Beispiel verwendeten Instrumenten umgehen. Ich benutze MySql 5.0, aber ich denke es ist egal.

UPD: Quellcode

Pupil.java - meine persistenten Klasse

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 ist Mapping für diese Klasse

<?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 - Konfiguration für den Winterschlaf

<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 - Klasse für die Prüfung überwintern

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(); 
    } 
} 

Mein Libs: antlr-2.7.6.jar, asm.jar, asm-attrs .jar, cglib-2.1.3.jar, commons-collections-2.1.1.jar, commons-logging-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? jboss Werkzeuge? Müssen Sie die Verbindungsinformationen in den jboss tools preferences konfigurieren? – Surya

+0

IntelliJ IDEA 7, Hibernate 3.2, jdk 1.6. Warten Sie, ich füge Code – Roman

Antwort

17

Dies hat nichts mit Hibernate zu tun, dies ist ein IDEA "Problem" und Sie müssen es richtig für die Überprüfung der Tabellennamen in hbm.xml konfigurieren.Von 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.

zu IDEA Gilt 7 auch, lesen Sie den ganzen Thread, falls erforderlich.

+0

Ich habe bereits die gleiche Antwort gefunden (wie Sie die Frage vor fast einem Jahr gefragt wurde). Aber trotzdem ist es korrekt. – Roman

+0

@Roman Kein Problem :) Eigentlich hat der "Community" -Benutzer heute Morgen diese Frage gestellt, deshalb habe ich eine Antwort geschrieben. Oh, und in diesem Fall, wenn Sie eine Lösung finden, zögern Sie nicht, Ihre eigene Antwort zu veröffentlichen und sie zu akzeptieren. –

1

Wir benötigen wesentlich mehr Informationen, um Ihnen zu helfen.

Ist dies eine Befehlszeilenanwendung? Welcher Laufzeitfehler ist gegeben? Welche IDE verwendest du? Welche Ausgabe wird beim Aktivieren der Debugprotokollierung von Hibernate ausgegeben?

+0

Es ist Kompilierfehler, IDE ist IntelliJ IDEA, und es sollte ein berühmtes Problem sein, wie ich aus der Referenz verstehe. – Roman

+0

Bitte beantworten Sie die anderen Fragen, damit wir Ihnen helfen können. Und bezüglich Ihres Fehlers: das ist kein kompilierter Code: Die .cfg.xml ist lediglich eine Konfigurationsdatei. Vielleicht, wenn Sie auf das von Ihnen verwendete Beispiel verlinken? – DarkSquid

+0

Eigentlich weiß ich nicht, wie ich Ihnen den Code zeigen soll. Ich bin fast sicher, dass der Code in Ordnung ist und das Problem mit einigen Einstellungen (oder vielleicht habe ich einige nesecary JAR-Datei verloren). Ich werde versuchen, etwas hinzuzufügen – Roman

1

Ihre IDE sagt Ihnen, dass sie die Tabelle nicht finden kann. Sie können dies in IDEA als Warnung ändern, damit Ihr Projekt zumindest kompiliert wird.

0

Um eine hbm.xml Dateizuordnungen zu validieren, sind nur die folgenden (Intellij Ultimative 2017,1):

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

Sie haben eine Datenquelle für die Datenbank des Servers hinzugefügt. Jetzt sollten Sie die Datenquelle erstellen. Der nächste Schritt ist das Hinzufügen dieser Datenquelle zu Hibernate-Zuordnungen. Folge mir einfach:

View -> Tool Windows -> Persistence 

Das Persistence-Fenster wird geöffnet. Sie müssen das Projekt aufgelistet sehen.

Im geöffneten Fenster sollte es zwei Spalten geben: "Session Factory" und "Data Source". Fügen Sie in der zweiten Spalte einfach die oben definierte Datenquelle hinzu.