寻找一个不被弃用的会话工厂
我正在处理hibernate,当我打开当前项目时,我发现我的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-请-不要-贬低自己动手/
该文章来自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再次certificate了错误! 已过时。 它指的是:
org.hibernate.boot.registry.StandardServiceRegistryBuilder
我再次用Google搜索。 结果不那么令人满意……
我开始修改代码……
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); Configuration configuration = new Configuration(); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession();
抛出exception……
org.hibernate.HibernateException:未设置’hibernate.dialect’时,Connection不能为null
在线:
SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
我很确定这是因为我没有指定任何配置设置。 其实,我不想。 我对hibernate.cfg.xml感到满意。
我使用configuration.addFile玩了一下(… – 不是那么成功……
有没有人对此有所了解? 谢谢
更新:(hibernate.cfg.xml)
com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost\SQLEXPRESS qohelet password thread false org.hibernate.dialect.SQLServerDialect 240 5 3 10 60 20 50 3
更新(2014年2月16日):我认为有必要向您展示我的pom.xml。 我花了一段时间才弄清楚Hibernate-Framework的哪个组合适合我…
org.hibernate.common hibernate-commons-annotations 4.0.2.Final org.hibernate hibernate-core 3.6.10.Final hibernate-commons-annotations org.hibernate.common hibernate-jpa-2.1-api org.hibernate.javax.persistence hibernate-commons-annotations org.hibernate org.hibernate hibernate-entitymanager 4.1.8.Final hibernate org.hibernate hibernate-annotations org.hibernate hibernate-commons-annotations org.hibernate hibernate-jpa-2.1-api org.hibernate.javax.persistence org.hibernate hibernate-commons-annotations 3.2.0.Final org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final org.hibernate hibernate-jpamodelgen 1.1.1.Final provided
我认为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版本4中.3不推荐使用buildSessionfactory()和ServiceRegistryBuilder()。
所以你已经改变了你的编码,如下所示,以获得hibernate版本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(); }
}
由于我有时间对我的软件进行现代化改造,所以我决定付出一些努力并进行一些研究:
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/ ):
org.hibernate hibernate-core 5.0.0.Final
其他一些小问题阻止了我:在hibernate.cfg.xml
我不得不将行从update
更改为auto
:
auto
将它与我的旧pom.xml进行比较…… – 然后我与Hibernate进行了第一次“相遇”,并添加了一切看似有用的内容,直到它工作为止。 在它这样做之后我停止了触摸它…差不多两年……永远不要改变一个“胜利”的团队,对吧?
org.hibernate.common hibernate-commons-annotations 4.0.2.Final org.hibernate hibernate-core 4.1.12.Final hibernate-commons-annotations org.hibernate.common hibernate-jpa-2.1-api org.hibernate.javax.persistence hibernate-commons-annotations org.hibernate org.hibernate hibernate-entitymanager 4.1.8.Final hibernate org.hibernate hibernate-annotations org.hibernate hibernate-commons-annotations org.hibernate hibernate-jpa-2.1-api org.hibernate.javax.persistence org.hibernate hibernate-commons-annotations 3.2.0.Final org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final org.hibernate hibernate-jpamodelgen 1.1.1.Final provided
- Hibernate本机查询:无效的列名错误SQL-17006
- AnnotationException引用的属性不是(一个|多个)ToOne
- 无法阻止Hibernate将日志写入控制台(log4j.properties没问题)
- Hibernate – Custom Dialect的BigDecimal列映射
- 可以在另一个查询的结果集上选择HQL吗?
- 使用hibernate和gilead for gwt添加到实体类中保存的列表时的LazyInitializationException
- Hibernate和Serializable实体
- 使用内部联接使用hibernate返回多个对象类型
- 使用Hibernate回调的优点?