2011-02-08 31 views
10

Estoy intentando utilizar hibernación con el muelle 3 MVC pero al llegar el momento en que esta excepción lanzada. Creo que tengo que definir mi hibernate.cfg.xml en algún lugar, pero no estoy seguro de dónde?org.hibernate.HibernateException: No se encontró /hibernate.cfg.xml

básicamente he seguido este ejemplo aquí http://www.nabeelalimemon.com/blog/2010/05/spring-3-integrated-with-hibernate-part-a/ Y en particular vi esta línea de código que hay que supone que "mágicamente" encontrar mi archivo hibernate.cfg usando esto:

return new Configuration().configure().buildSessionFactory(); 

supongo que no es correcto ? Actualmente tengo mi archivo hibernate.cfg dentro src/com/jr/hibernate/

a continuación es mi archivo CFG:

<?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> 
    <!-- Database connection settings --> 
    <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://localhost:3306/racingleague</property> 
    <property name="connection.username">username</property> 
    <property name="connection.password">password</property> 
    <property name="hibernate.format_sql">true</property> 
    <!-- JDBC connection pool (use the built-in) --> 
    <property name="connection.pool_size">1</property> 
    <!-- SQL dialect --> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <!-- Enable Hibernate's automatic session context management --> 
    <property name="current_session_context_class">thread</property> 
    <!-- Disable the second-level cache --> 
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
    <!-- Echo all executed SQL to stdout --> 
    <property name="hibernate.show_sql">true</property> 
    <!-- Drop and re-create the database schema on startup --> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
    <!--property name="hbm2ddl.auto">update</property--> 
    <mapping resource="com/jr/model/hibernateMappings/user.hbm.xml"/> 
    </session-factory> 
</hibernate-configuration> 
clase

mi hibernación utils:

package com.jr.utils; 

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

public class HibernateUtils { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

     public static SessionFactory buildSessionFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      return new Configuration().configure().buildSessionFactory(); 
     } 
     catch (Throwable ex) { 
      // Make sure you log the exception, as it might be swallowed 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
     } 

} 

la que es llamada bu esta clase abstracta:

package com.jr.db; 

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

import com.jr.utils.HibernateUtils; 

public abstract class DbWrapper<T> { 

    private static SessionFactory sessionFactory = null; 
    private static Session session; 

    public DbWrapper() { 
     setSessionFactory(); 
    } 

    private void setSessionFactory() { 
     sessionFactory = HibernateUtils.buildSessionFactory(); 
     session = sessionFactory.getCurrentSession(); 
    } 

    public boolean addNewItem(T dbItem) { 

     try { 
      session.getTransaction().begin(); 
      session.save(dbItem); 
      session.getTransaction().commit(); 
     } catch (Exception e) { 
      System.err.println("error exception when adding new item to table" 
        + e); 
     } finally { 

      session.close(); 
      sessionFactory.close(); 
     } 

     return false; 

    } 

    public abstract boolean removeItem(String uid); 

    public abstract boolean modifyItem(String uid, T item); 

} 

Y aquí es el controlador que originalmente hace algo de hibernación cosas:

private Logger logger = Logger.getLogger(UserController.class); 

    private UserDb userDb; 

@RequestMapping(value = "/user/registerSuccess", method = RequestMethod.POST) 
public String submitRegisterForm(@Valid User user, BindingResult result) { 

    // validate the data recieved from user 
    logger.info("validate the data recieved from user"); 
    if (result.hasErrors()) { 
     logger.info("form has "+result.getErrorCount()+" errors"); 

     return "account/createForm"; 
    } else{ 
     // if everthings ok, add user details to database 
     logger.info("if everthings ok, add user details to database"); 

     userDb = new UserDb(); 

     userDb.addNewItem(user); 

     // display success and auto log the user to the system. 
     return "account/main"; 
    } 

} 

Saludos con anticipación. También tengo todas mis asignaciones de xml de hibnate de tabla en la misma ubicación que mi archivo hibernate.cfg.xml

Respuesta

25

En lugar de colocar el archivo hibernate.cfg.xml en el directorio src/com/jr/hibernate/, colóquelo en el directorio src. Aparecerá automáticamente en el directorio WEB-INF/classes, tal como lo mencionaron aquí.

+0

aplausos. funciona. Tengo otra pregunta. parece que mi aplicación no puede encontrar mis asignaciones de xml de hibernación. Lo tengo en lugares en com.jr.hibernateMappings pero el build.xml no parece construir y compilar mis archivos hbm.xml. ¿está en el lugar equivocado de nuevo? ¿necesita estar en la carpeta WAR/WEB-INF/classes? Me gustaría mucho prefiero que sea dentro del directorio src, si es posible – jonney

+0

Gracias ... después de mover mi archivo (hibernate.cfg.xml) a SRC se localizará el archivo muchas gracias de nuevo –

13

hibernate.cfg.xml debe encontrarse en la raíz del classpath cuando se inicia la aplicación web.

Si está utilizando maven para compilar el proyecto, coloque hibernate.cfg.xml en el directorio src/main/resources de modo que cuando construya el paquete war, se colocará automáticamente en /WEB-INF/classes.

Si no está utilizando Maven, colocar el archivo directamente en el directorio de WEB-INF/classes.

4

hibernate.cfg.xml debe estar en WEB-INF/classes. Como alternativa, puede cargarlo desde una ubicación personalizada al pasar el argumento correspondiente al método configure(..).

+0

Bozho, 'config.configure ("/resources/hibernate.cfg.xml ");' no funciona para mí. En realidad, estoy haciendo una sencilla aplicación 'hibernate 3.1'. Por cierto, 'config' es de tipo' AnnotationConfiguration'. –

0

En IntelliJ ir a "Configuración del proyecto abierto" >> Módulos >> Hibernate y orientar su archivo hibernate.cfg.xml utilizado en su proyecto.

0

Tengo el mismo problema y muevo hibernate.cfg.xml al directorio src/main/resources resuelto, se colocará automáticamente en/WEB-INF/classes.

2

Si utiliza Maven, debe colocar el archivo hibernate.cfg.xml en la siguiente ruta /src/main/java/resources/hibernate.cfg.xml en Intellij IDEA. A continuación, en la clase de ejecución de la aplicación basta con insertar la línea:..

fábrica SessionFactory = new configuración configure() ("hibernate.cfg.xml") addAnnotatedClass().buildSessionFactory();

+0

Thnx. Casi perdí 2 días después de esto. – SAM

Cuestiones relacionadas