GVKun编程网logo

Spring 4.3.0.RELEASE,Hibernate 5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法

7

想了解Spring4.3.0.RELEASE,Hibernate5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法的新动态吗?本文将为您提供

想了解Spring 4.3.0.RELEASE,Hibernate 5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法的新动态吗?本文将为您提供详细的信息,此外,我们还将为您介绍关于Grails 2.4 + Hibernate 4 +可搜索的插件= ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl、hibernate +spring sessionfactory 配置、Hibernate 学习之 SessionFactory 的 opensession 和 getCu...、HibernateTemplate vs HibernateDaoSupport vs SessionFactory注入的新知识。

本文目录一览:

Spring 4.3.0.RELEASE,Hibernate 5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法

Spring 4.3.0.RELEASE,Hibernate 5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法

我在应用程序中使用Spring 4.3.0.RELEASE和Hibernate 5.0.9.Final一起使用,我不断

java.lang.NoSuchMethodError: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/util/Map;

如果我更新了Hibernate 5.2.0.Final,一切正常。看来Spring 4.3.0与Hibernate
5.0不兼容,对吗?我找不到关于不支持Hibernate 5.0的任何信息。

在Hibernate 5.2中,该方法存在,在Hibernate
5.0中该方法尚不存在(只需将URL中的5.2替换为5.0):http
//docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/ engine / spi /
SessionFactoryImplementor.html

我创建了简单的复制器:https :
//github.com/trepel/spring43-hibernate50-error

感谢你的回复。

答案1

小编典典

已经存在一个问题,即SPR-14365。

Grails 2.4 + Hibernate 4 +可搜索的插件= ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl

Grails 2.4 + Hibernate 4 +可搜索的插件= ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl

最近,我将一个简单的Grails应用程序与Searchable插件集成在一起。我发现,Searchable插件不适用于Hibernate 4库。

在这里您可以找到一个示例应用程序,其中仅包含干净的Grails 2.4应用程序,仅添加了Searchable插件-https:
//github.com/wololock/grails-searchable-
example

当我运行该应用程序时:

runtime ":hibernate4:4.3.5.5"

依赖关系,它不会启动并引发异常:

ClassNotFoundException: org.hibernate.impl.SessionFactoryImpl

我已经发现,在Hibernate4中,SessionFactoryImpl已移至org.hibernate.internal包中,并且Compass似乎在旧位置中查找此类:

2014-10-11 19:41:58,142 [localhost-startStop-1] ERROR context.GrailsContextLoaderListener  - Error initializing the application: org/hibernate/impl/SessionFactoryImplMessage: org/hibernate/impl/SessionFactoryImplLine | Method->>   95 | injectLifecycle in org.compass.gps.device.hibernate.lifecycle.DefaultHibernateEntityLifecycleInjector

切换回:

runtime ":hibernate:3.6.10.17"

和改变

cache.region.factory_net.sf.ehcache.hibernate.EhCacheRegionFactory''

在DataSource.groovy中解决了该问题。

我的问题是: 是否可以在Hibernate 4中使用Searchable插件,或者我们必须等待或解决Compass /
Searchable源代码中的问题?您如何在Grails应用程序中处理该问题?谢谢您的提示。

答案1

小编典典

Hiberate 3.x和4.x之间有一些软件包和类名的更改,因此,在极少数情况下,与Hibernate
3.x一起使用的代码无法与4.x一起使用。除了名称更改之外,事情的工作方式也发生了很大的内部变化,因此编译的代码不一定会运行。应用程序选项1是降级到Hibernate3.x。其中的配置设置已包括在内并已注释掉(BuildConfig.groovy,DataSource.groovy),因此这是一个非常快速的选项。如果您依赖于4.x中添加的功能,显然不是一个选择,这只会延迟真正的问题,直到您必须升级Hibernate。

使用Hibernate
3所需要的所有插件进行更新,以支持hibernate4,无论是作为替代,或者最理想的是采用一些交叉编译的技巧或其他3,同时支持第三党库。假设用户最终将从3.x升级的一个插件选项是创建一个3.x分支,并为Hibernate
4启动插件的新主版本(在master分支中),并进行更改以使其在4中工作。
X。使用3.x分支支持安全更新和非常小的问题,但不要添加新功能。很多插件作者可能会走这条路。

在某些情况下,另一种选择最有意义-什么也不要做。这适用于可搜索。可搜索的使用方法http://www.compass-
project.org/实际上已经失效-其最新版本是4年前。Shay
Banon现在是http://www.elasticsearch.org/的CTO,我相信Shay不再从事Compass的工作,而创办了Elasticsearch,因为将Compass扩展到单个服务器之外是不切实际的。可以将Lucene索引存储在数据库中,但是这样做确实可以为您提供集中式的单个编写器和一个或多个(具有数据库集群或类似功能)集中式的读取器,而带有自定义协议的优化搜索服务器等也可以使用更有意义。

Solr也达成共识,似乎是首选Elasticsearch。Solr
Grails插件三年没有更新,Elasticsearch插件也发霉了,但是最近Noam
Tenne接任了该插件的负责人,做了很多出色的工作,并且在过去的几个月中完成了多个发行版。请注意,旧插件elasticsearchelasticsearch-gorm插件已合并并更新以创建新elasticsearch插件。

还有一种选择是使用Hibernate自己的产品Hibernate
Search。有一个插件,但自2012年以来未进行过更新。自私的是,这是我的个人喜好-
选择此选项,接管插件(假设是肯定的答复,或者来自原始作者的未答复)并更新为兼容使用最新的Hibernate
4.x插件。这将为我们提供一个替代Elasticsearch的好选择。

除非如此,否则我认为Elasticsearch是您的最佳选择。

hibernate +spring sessionfactory 配置

hibernate +spring sessionfactory 配置

<bean id="sessionFactory"> 
<property name="dataSource" ref="dataSource"></property> 
<!--<property name="configLocation" value="hibernate.cfg.xml"></property>-->         (3)
<property name="hibernateProperties"> 
<props> 
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
<prop key="hibernate.show_sql">true</prop> 
<prop key="hibernate.format_sql">true</prop> 
<prop key="hibernate.hbm2ddl.auto">update</prop> 
<prop key="hibernate.cache.use_second_level_cache">true</prop> 
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
</props> 
</property> 
<property name="packagesToScan" value="xxx.xxx" /> 
</bean> 

上面的就是 hibernate 的 sessionfactory 的配置,其中最下面的 </property> 
<property name="packagesToScan" value="xxx.xxx" /> 
就是告诉 hibernate 在 xxx.xxx 这个包下去搜索注释生成数据库表

如果用(3)的配置就需要 hibernate.cfg.xml

Hibernate 学习之 SessionFactory 的 opensession 和 getCu...

Hibernate 学习之 SessionFactory 的 opensession 和 getCu...

1 。 Hibernate 的 Id 生成策略
XXOO.hbm.xml 下 class 标签的 主键 id 标签中 使用 <generator/> 标签指定 生成策略。
<hibernate-mapping>
<class name="com.myeclipse.OneToOne.Student2" table="student2" catalog="hibernate">
<id name="id" type="long">
<column name="id" />
<!--xml 中配置 id 生成策略 -->
<generator/> 指定生成策略。
</id> 》》》》》》》》 下面部分省略。《《《《《《《
2. 关于 SessionFactory 的取得 session 的方法:opensession()和 getCurrentSession () 的分析认知
简单代码如下:
Session session = sf.openSession () ; // 生成一个 session
Session session2 = sf.getCurrentSession (); // 取得一个当前的 Session
Session session3 = sf.getCurrentSession (); // 取得当前 session
只要没有提交事务 当前会话 (current session 就一直存在的。以后用 getCurrentSession 取得的 session 都是同一个。)
System.out.println ("不应该是 false 啊??"+(session2 == session));
System.out.println ("这个呢??"+(session2 == session3));
结果:
false
true
调试发现:
首先发现 这三个 session 的 id 是这样的。。 session2 与 session3 的 id 是相等的。
分析:
session1 采用 opensession 方法取得的 session ,不管有无当前会话,都要直接新开一个 session。
session2 session3 采用 getCurrentsession 方法获得,
两个方法取得的 session 不一样】
A Session begins when it is first needed, when the first call to getCurrentSession() is made.
It is then bound by Hibernate to the current thread.
1 getCurrentSession 创建的 session 会和绑定到当前线程,而 openSession 不会。
2 getCurrentSession 创建的线程会在事务回滚或事物提交后自动关闭,而 openSession 必须手动关闭
getCurrentSession () 使用当前的 session openSession () 重新建立一个新的 session

HibernateTemplate vs HibernateDaoSupport vs SessionFactory注入

HibernateTemplate vs HibernateDaoSupport vs SessionFactory注入

我在很多论坛上都看到过并且仍然感到困惑。我们将从Spring 3.1和Hibernate
4开始一个新项目,并且需要确定将Spring应用于Hibernate的策略:

  1. 直接访问Hibernate

会话会话= HibernateUtil.getSessionFactory()。getCurrentSession();
session.beginTransaction();

  1. 使用HibernateTemplate

列表bb =(List)hibernateTemplate.find(“ from Entity”);

  1. 使用HibernateDAOSupport类

清单bb =(List)getHibernateTemplate()。find(“ from Entity”);

您能帮我使用什么吗?我从CodeRanch和另一个链接中读到,它们告诉我们从 Hibernate 3.x
开始,我们应该注入SessionFactoryDAO类(使用@Repository)。

有人可以详细解释吗?

问候,

阿伦·库玛(Arun Kumar)

答案1

小编典典

Spring本身建议不要在该类的javadoc中再使用HibernateTemplate
。您可以直接将会话工厂声明为Spring
bean,将其作为其他任何Spring bean注入您自己的组件中,然后直接使用本机Hibernate
API(使用sessionFactory.getCurrentSession())。

关于Spring 4.3.0.RELEASE,Hibernate 5.0.9.Final,缺少SessionFactoryImplementor.getProperties方法的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Grails 2.4 + Hibernate 4 +可搜索的插件= ClassNotFoundException:org.hibernate.impl.SessionFactoryImpl、hibernate +spring sessionfactory 配置、Hibernate 学习之 SessionFactory 的 opensession 和 getCu...、HibernateTemplate vs HibernateDaoSupport vs SessionFactory注入等相关内容,可以在本站寻找。

本文标签: