2012-04-29 81 views
0

我已經用Hibernate 3設置了一個Spring項目,並且使用了註釋。我剛剛實現了一個導入腳本,用於填充對象並使用我從HibernateSessionFactory.getSession()調用中獲得的會話對象進行保存。爲什麼hibernate什麼都不做?

我的配置是這樣的(名字&細節改變,以保護無辜等等)

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

您至少有以下問題:您不啓動並提交任何事務。有關如何處理Hibernate事務的詳細信息,請閱讀http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactions-demarcation-nonmanaged

請注意,由於您使用的是Spring,因此您一定要使用它的Hibernate支持,這將完全避免使用此HibernateSessionFactory類,並且允許您以聲明方式而不是編程方式爲事務劃分界限。不要重新發明輪子,並閱讀http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#orm-hibernate