0

我已经用 Hibernate 3 建立了一个 Spring 项目,并且我正在使用注释。我刚刚实现了一个导入脚本,它填充一个对象并使用我从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=update 配置应该意味着我的表将自动创建。

我的 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()调用也没有效果或错误。

这是配置错误还是逻辑错误?干杯。

4

1 回答 1

1

您至少有以下问题:您没有启动和提交任何事务。阅读http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#transactions-demarcation-nonmanaged以了解有关您应该如何处理 Hibernate 事务的详细信息。

Note that since you're using Spring, you should definitely use its Hibernate support, which would completely avoid the need for this HibernateSessionFactory class, and would allow you to demarcate transactions declaratively, instead of programmatically. Don't reinvent the wheel, and read http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#orm-hibernate.

于 2012-04-29T17:47:29.630 回答