2009-06-09 20 views
7

Estoy intentando hacer que el trabajo sea el ejemplo de la referencia de hibernación.Error de hibernación: no se puede resolver la tabla

Tengo una tabla simple Alumno con id, nombre y campos de edad. Creé una clase Java correcta (como creo) para ella de acuerdo con todas las reglas de java-beans.

He creado el archivo de configuración - hibernate.cfg.xml, como en el ejemplo de referencia.

He creado el mapeo de hibernación para una clase Pupil, y aquí está el error.

<hibernate-mapping> 
    <class name="Pupil" table="pupils"> 
     ... 
    </class> 
</hibernate-mapping> 

table = "pupils" es de color rojo en mi IDE y veo el mensaje "no se puede resolver la mesa de los alumnos". También he fundado una nota muy extraña en referencia que dice que la mayoría de los usuarios falla con el mismo problema al intentar ejecutar el ejemplo.

Ah ... Estoy muy enojado con este ejemplo .. En mi humilde opinión, si los autores saben que existe tal problema, deberían agregar algo de información al respecto.

Pero, ¿cómo debería solucionarlo? No quiero tratar con Ant aquí y con otros instrumentos utilizados en el ejemplo. Estoy usando MySql 5.0, pero creo que no importa.

UPD: código fuente

Pupil.java - mi clase persistente

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 es mapeado para esta clase

<?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 - Configuración para hibernar

<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 - clase para las pruebas de hibernación

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

Mis 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? herramientas jboss? ¿necesita configurar la información de conexión en las preferencias de las herramientas jboss? – Surya

+0

IntelliJ IDEA 7, Hibernate 3.2, jdk 1.6. Espera, agregaré el código – Roman

Respuesta

17

Esto no tiene nada que ver con Hibernate, este es un "problema" de IDEA y necesita configurarlo correctamente para la validación de nombres de tablas en 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.

se refiere a: IDEA 7 también, leer todo el hilo si es necesario.

+0

Ya encontré la misma respuesta (como se puede ver, la pregunta se hizo hace casi un año). Pero de todos modos es correcto. – Roman

+0

@Roman No hay problema :) En realidad, el usuario de "Comunidad" se topó con esta pregunta esta mañana, por eso publiqué una respuesta. Ah, y en tal caso, si encuentra una solución, no dude en publicar su propia respuesta y aceptarla. –

1

Necesitamos mucha más información para ayudarlo.

¿Es esta una aplicación de línea de comandos? ¿Qué error de tiempo de ejecución se da? ¿Qué IDE estás usando? ¿Cuál es el resultado de habilitar el registro de depuración de Hibernate?

+0

Es un error de compilación, IDE es IntelliJ IDEA, y debería ser un problema famoso, como yo lo entiendo por la referencia. – Roman

+0

Responda las otras preguntas para que podamos ayudarlo. Y con respecto a su error: no es código compilado: el archivo .cfg.xml es simplemente un archivo de configuración. ¿Tal vez si enlazas a la muestra que estás usando? – DarkSquid

+0

En realidad, no sé cómo mostrarte el código. Estoy casi seguro de que el código está bien y el problema con algunas configuraciones (o tal vez perdí algún archivo jar nessecary). Intentaré agregar algo – Roman

1

Su IDE le indica que no puede encontrar la mesa. Puede cambiarlo a solo una advertencia en IDEA para que su proyecto se compile al menos.

0

para validar un archivo hbm.xml mapeos, simplemente hacer lo siguiente (Intellij último 2017.1):

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

Ha añadido una fuente de datos para el servidor de base de datos. Ahora deberías crear el origen de datos. El siguiente paso es agregar esta fuente de datos para hibernar las asignaciones. Sígueme:

View -> Tool Windows -> Persistence 

Se abrirá la ventana Persistencia. Debes ver el proyecto en la lista.

Right click on the project -> Assign Data Sources... 

En la ventana abierta, no debe haber 2 columnas: "Sesión de fábrica" ​​y "origen de datos". Simplemente agregue el origen de datos definido arriba en la segunda columna.

Cuestiones relacionadas