【问题标题】:Looking for a not-deprecated session-factory寻找未弃用的会话工厂
【发布时间】:2013-07-28 11:47:59
【问题描述】:

我正在处理休眠,当我打开我当前的项目时,我发现我的 Session-Factory 已被弃用:

AnnotationConfiguration af = new AnnotationConfiguration();
SessionFactory factory = af.configure().buildSessionFactory();
Session session = factory.openSession();

AnnotationConfiguration 现在似乎已被弃用...所以我检查了 JavaDoc,并被告知它已移至:

org.hibernate.cfg.Configuration

到目前为止,我的代码运行良好,实际上我不想更改它...但是我用 Google 搜索并发现有人问自己同样的问题,为什么需要更改 SessionFactory... http://rgordon.co.uk/blog/2012/02/24/hibernate-please-dont-deprecate-yourself/

这篇文章来自 2012 年(所以不是那么旧...),并以这种方式描述了所有内容:

ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder();
serviceRegistryBuilder.applySettings(properties);
ServiceRegistry serviceRegistry = serviceRegistryBuilder.buildServiceRegistry();

Configuration configuration = new Configuration().addClass(FeedTradePersistable.class);

SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

我实现了。 JavaDoc 再次证明这是错误的!已弃用。 指的是:

org.hibernate.boot.registry.StandardServiceRegistryBuilder

我又用谷歌搜索了一遍。结果并不那么令人满意...

我开始修改代码了……

ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
Configuration configuration = new Configuration();
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();

然后抛出异常...

org.hibernate.HibernateException:连接不能为空时 'hibernate.dialect' 未设置

在线:

SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

我很确定这是因为我没有指定任何配置设置。其实,我不想。 hibernate.cfg.xml 我觉得很舒服。

我玩了一下 configuration.addFile(.. - 没那么成功...

有人知道吗? 谢谢

更新:(hibernate.cfg.xml)

<?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>
    <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
    <property name="hibernate.connection.url">jdbc:sqlserver://localhost\SQLEXPRESS</property>
    <property name="hibernate.connection.username">qohelet</property>
    <property name="hibernate.connection.password">password</property>
    <property name="current_session_context_class">thread</property>
    <property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
    <property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
    <property name="bonecp.setIdleMaxAgeInMinutes">240</property>
    <property name="bonecp.setIdleConnectionTestPeriodInMinutes">5</property>
    <property name="bonecp.partitionCount">3</property>
    <property name="bonecp.acquireIncrement">10</property>
    <property name="bonecp.maxConnectionsPerPartition">60</property>
    <property name="bonecp.minConnectionsPerPartition">20</property>
    <property name="bonecp.statementsCacheSize">50</property>
    <property name="bonecp.releaseHelperThreads">3</property>
        <mapping class="order.Line" />
        <mapping class="order.Order" />
        <mapping class="order.Group" />
  </session-factory>
</hibernate-configuration>

更新(2014 年 2 月 16 日): 我认为也有必要向您展示我的 pom.xml。我花了一段时间才弄清楚哪种 Hibernate-Framework 组合适合我...

<dependency>
    <groupId>org.hibernate.common</groupId>
    <artifactId>hibernate-commons-annotations</artifactId>
    <version>4.0.2.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>3.6.10.Final</version>
    <exclusions>
        <exclusion>
            <artifactId>hibernate-commons-annotations</artifactId>
            <groupId>org.hibernate.common</groupId>
        </exclusion>
        <exclusion>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <groupId>org.hibernate.javax.persistence</groupId>
        </exclusion>
        <exclusion>
            <artifactId>hibernate-commons-annotations</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.1.8.Final</version>
    <exclusions>
        <exclusion>
            <artifactId>hibernate</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
        <exclusion>
            <artifactId>hibernate-annotations</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
        <exclusion>
            <artifactId>hibernate-commons-annotations</artifactId>
            <groupId>org.hibernate</groupId>
        </exclusion>
        <exclusion>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <groupId>org.hibernate.javax.persistence</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-commons-annotations</artifactId>
    <version>3.2.0.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate.javax.persistence</groupId>
    <artifactId>hibernate-jpa-2.0-api</artifactId>
    <version>1.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>1.1.1.Final</version>
    <scope>provided</scope>
</dependency>

【问题讨论】:

  • 查看hibernate-dialect 属性。这是必要的。
  • 我知道,它已经在 hibernate.cfg.xml 中指定了。我不明白为什么我应该声明两次。
  • 向我们展示您的配置文件。
  • 我添加了hibernate.cfg.xml

标签: java hibernate hibernate-annotations sessionfactory sql-server-2012-express


【解决方案1】:

我认为现在是 4.3:

   Configuration configuration=new Configuration()
            .configure(); // configures settings from hibernate.cfg.xml

    StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();

    // If you miss the below line then it will complaing about a missing dialect setting
    serviceRegistryBuilder.applySettings(configuration.getProperties());

    ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();
    sessionFactory = configuration.buildSessionFactory(serviceRegistry);

【讨论】:

  • 这个问题的主要问题是由于 Hibernate-Versions 中的几个不兼容问题。我花了一段时间才弄清楚哪些版本可以很好地协同工作。我使用 Hibernate 3.6.10.Final,hibernate 实体管理器 3.6.10.Final,hibernate-commons-annotations 3.2.0.Final,hibernate-jpa-2.0-api 1.0.1.Final。现在我更新到 4.3.0.CR2(只有 Hibernate)并得到:`java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.ClassLoadingException at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader .java:1714) sessionFactory 赋值
【解决方案2】:

是的,在休眠版本 4.3 中 buildSessionfactory() 和 ServiceRegistryBuilder() 都已弃用。

所以你已经改变你的编码如下以获得休眠版本 4.3 的会话工厂

public class HibernateSessionFactory {

private static final SessionFactory sessionFactory = buildSessionFactory1();

private static SessionFactory buildSessionFactory1() {
    Configuration configuration = new Configuration().configure(); // configuration
                                                                    // settings
                                                                    // from
                                                                    // hibernate.cfg.xml

    StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder();


    serviceRegistryBuilder.applySettings(configuration.getProperties());

    ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

    return configuration.buildSessionFactory(serviceRegistry);
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

public static void shutdown() {
    // Close caches and connection pools
    getSessionFactory().close();
}

}

【讨论】:

  • 能否请您也发布您的 pom.xml?
【解决方案3】:

当我有时间对我的软件进行现代化改造时,我决定投入一些精力并进行了一些研究:

http://www.codejava.net/frameworks/hibernate/building-hibernate-sessionfactory-from-service-registry 提供了一个现代的HibernateUtil

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {

private static SessionFactory sessionFactory;

public static SessionFactory getSessionFactory() {
    if (sessionFactory == null) {
        Configuration configuration = new Configuration().configure();
        ServiceRegistryBuilder registry = new ServiceRegistryBuilder();
        registry.applySettings(configuration.getProperties());
        ServiceRegistry serviceRegistry = registry.buildServiceRegistry();

        sessionFactory = configuration.buildSessionFactory(serviceRegistry);            
    }

    return sessionFactory;
}

}

尽管这个版本似乎也能正常工作:

import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
    try {
        Configuration cfg = new Configuration();
        sessionFactory = cfg.configure("hibernate.cfg.xml").buildSessionFactory();
    } catch (Throwable ex) {
        Logger.getLogger(HibernateUtil.class.getName()).log(Level.SEVERE, null, ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static SessionFactory getSessionFactory() {
    return sessionFactory;
}

}

但我的问题是我不想将新版本与旧库集成。更新后我遇到了一个

java.lang.NoSuchMethodError: org.hibernate.annotations.common.reflection.java.JavaReflectionManager.injectClassLoaderDelegate(Lorg/hibernate/annotations/common/reflection/ClassLoaderDelegate;)V

经常。 恼人的。通常Mkyong 提供了很好的解决方案,但在我的情况下,他写了Stackoverflow 的相反解决方案...

所以我搜索了一些存储库,发现了一个非常简单的解决方案(比较:http://hibernate.org/orm/downloads/):

<!-- HIBERNATE -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.0.0.Final</version>
</dependency>

其他一些让我停下来的小问题: 在hibernate.cfg.xml 中,我不得不将行从update 更改为auto

<property name="hbm2ddl.auto">auto</property> 

将它与我的旧 pom.xml 进行比较... - 那时我第一次“遇到” Hibernate,并添加了所有看起来有用的东西,直到它起作用。在它这样做之后,我不再碰它了......将近两年......永远不要改变“获胜”的球队,对吧?

<dependency>
            <groupId>org.hibernate.common</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>4.0.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.1.12.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>hibernate-commons-annotations</artifactId>
                    <groupId>org.hibernate.common</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hibernate-jpa-2.1-api</artifactId>
                    <groupId>org.hibernate.javax.persistence</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hibernate-commons-annotations</artifactId>
                    <groupId>org.hibernate</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.1.8.Final</version>
            <exclusions>
                <exclusion>
                    <artifactId>hibernate</artifactId>
                    <groupId>org.hibernate</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hibernate-annotations</artifactId>
                    <groupId>org.hibernate</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hibernate-commons-annotations</artifactId>
                    <groupId>org.hibernate</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>hibernate-jpa-2.1-api</artifactId>
                    <groupId>org.hibernate.javax.persistence</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-commons-annotations</artifactId>
            <version>3.2.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jpamodelgen</artifactId>
            <version>1.1.1.Final</version>
            <scope>provided</scope>
        </dependency>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2013-10-21
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多