我正在处理休眠问题,当我打开当前项目时,我发现我的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/博客/ 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>
当我有一些时间使软件现代化时,我决定做出一些努力并进行了一些研究:
http://www.codejava.net/frameworks/hibernate/building-hibernate- sessionfactory-from-service- registry 提供了一种现代化的方法HibernateUtil:
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:
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>