2012-04-29 2 views
0

Я создал проект Spring с Hibernate 3, и я использую аннотации. Я только что реализовал сценарий импорта, который заполняет объект и сохраняет с помощью объекта сеанса, который у меня есть из вызова HibernateSessionFactory.getSession().Почему спящий режим ничего не делает?

Моя конфигурация выглядит следующим образом (имена & детали изменены, чтобы защитить невинных и т.д.)

<?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"> 

<!-- Generated by MyEclipse Hibernate Tools.     --> 
<hibernate-configuration> 

<session-factory> 
    <property name="hbm2ddl.auto">update</property> 
    <property name="dialect"> 
     org.hibernate.dialect.PostgreSQLDialect 
    </property> 
    <property name="connection.url"> 
    jdbc:postgresql://localhost:5432/foobar 
    </property> 
    <property name="connection.username">myuser</property> 
    <property name="connection.password">mypass</property> 
    <property name="connection.driver_class"> 
     org.postgresql.Driver 
    </property> 
    <property name="myeclipse.connection.profile"> 
     org.postgres.Driver 
    </property> 
    <mapping class="com.mycompany.Foo" /> 
    <mapping class="com.mycompany.Bar" /> 
</session-factory> 

</hibernate-configuration> 

Насколько я понимаю, конфигурация hbm2ddl.auto = обновление должно означать, мои таблицы будут созданы автоматически ,

Мой HibernateSessionFactory выглядит следующим образом:

package com.mycompany; 

import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.cfg.Configuration; 
import org.hibernate.cfg.AnnotationConfiguration; 

/** 
* Configures and provides access to Hibernate sessions, tied to the 
* current thread of execution. Follows the Thread Local Session 
* pattern, see {@link http://hibernate.org/42.html }. 
*/ 
public class HibernateSessionFactory { 

    /** 
    * Location of hibernate.cfg.xml file. 
    * Location should be on the classpath as Hibernate uses 
    * #resourceAsStream style lookup for its configuration file. 
    * The default classpath location of the hibernate config file is 
    * in the default package. Use #setConfigFile() to update 
    * the location of the configuration file for the current session. 
    */ 
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; 
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 
    private static Configuration configuration = new AnnotationConfiguration();  
    private static org.hibernate.SessionFactory sessionFactory; 
    private static String configFile = CONFIG_FILE_LOCATION; 

    static { 
     try { 
      configuration.configure(configFile); 
      sessionFactory = configuration.buildSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
    } 

    private HibernateSessionFactory() { 
    } 

    /** 
    * Returns the ThreadLocal Session instance. Lazy initialize 
    * the <code>SessionFactory</code> if needed. 
    * 
    * @return Session 
    * @throws HibernateException 
    */ 
    public static Session getSession() throws HibernateException { 
     Session session = (Session) threadLocal.get(); 

     if (session == null || !session.isOpen()) { 
      if (sessionFactory == null) { 
       rebuildSessionFactory(); 
      } 
      session = (sessionFactory != null) ? sessionFactory.openSession() : null; 
      threadLocal.set(session); 
     } 

     return session; 
    } 

    /** 
    * Rebuild hibernate session factory 
    * 
    */ 
    public static void rebuildSessionFactory() { 
     try { 
      configuration.configure(configFile); 
      sessionFactory = configuration.buildSessionFactory(); 
     } catch (Exception e) { 
      System.err.println("%%%% Error Creating SessionFactory %%%%"); 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * Close the single hibernate session instance. 
    * 
    * @throws HibernateException 
    */ 
    public static void closeSession() throws HibernateException { 
     Session session = (Session) threadLocal.get(); 
     threadLocal.set(null); 

     if (session != null) { 
      session.close(); 
     } 
    } 

    /** 
    * return session factory 
    * 
    */ 
    public static org.hibernate.SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 

    /** 
    * return session factory 
    * 
    * session factory will be rebuilded in the next call 
    */ 
    public static void setConfigFile(String configFile) { 
     HibernateSessionFactory.configFile = configFile; 
     sessionFactory = null; 
    } 

    /** 
    * return hibernate configuration 
    * 
    */ 
    public static Configuration getConfiguration() { 
     return configuration; 
    } 
} 

Я уверен, что я использую этот код правильно, в основном логика моего кода следующим образом:

Session session = HibernateSessionFactory.getSession(); 

Foo foo = new Foo(); 
... 
session.save(foo); 

Так что нужно либо сохранить мои объекты или начать кричать и кричать о чем-то глупом, я сделал неправильно. Ничего не произошло.

В журналах нет выхода, таблицы по-прежнему отсутствуют, и я проверил соединение вручную и через плагин Eclipse, который напрямую использует конфигурацию. Даже вызовы save() не имеют эффекта или ошибки.

Это ошибка конфигурации или логики? Приветствия.

ответ

1

У вас есть хотя бы следующая проблема: вы не начинаете и не совершаете никаких транзакций. Прочтите http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactions-demarcation-nonmanaged для получения информации о том, как вы должны обрабатывать транзакции Hibernate.

Обратите внимание, что поскольку вы используете Spring, вы должны обязательно использовать его поддержку Hibernate, которая полностью исключает необходимость в этом классе HibernateSessionFactory и позволит вам демаркировать транзакции декларативно, а не программно. Не изобретайте велосипед и читайте http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#orm-hibernate.

Смежные вопросы