2012-04-29 9 views
0

私はHibernate 3でSpringプロジェクトをセットアップしましたが、私は注釈を使用しています。私はちょうどオブジェクトを生成し、HibernateSessionFactory.getSession()呼び出しから得たセッションオブジェクトを使用して保存するインポートスクリプトを実装しました。なぜ休止状態は何もしませんか?

私の設定は、私の知る限り理解し、hbm2ddl.auto =アップデートの設定は、私のテーブルが自動的に作成されますを意味しなければならない(名前無実などを保護するために変更&詳細)

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

次のようになります。

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

だから、これはどちらかのはず

マイHibernateSessionFactoryはこのようになります

私のオブジェクトを保存したり、叫んだり、私が間違って行った何か愚かなことについて叫んだりします。何も起こりません。

ログに出力はありません。テーブルはまだ存在せず、手動で、configを直接使用するEclipseプラグインを使って接続をテストしました。 save()呼び出しでさえ、影響やエラーはありません。

これは設定エラーか論理エラーですか?乾杯。

答えて

1

少なくとも次の問題があります。トランザクションを開始してコミットしないでください。 Hibernateトランザクションをどのように処理するのかについては、http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactions-demarcation-nonmanagedを参照してください。

Springを使用しているので、このHibernateSessionFactoryクラスの必要性を完全に回避するHibernateサポートを確実に使用し、プログラムではなく宣言的にトランザクションを区切ることができます。車輪を改造しないでください。http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#orm-hibernateをお読みください。