集成到 Play Framework (JPA) 中的 Hibernate Search
Hibernate Search integrated into Play Framework (JPA)
我正在尝试将 Hibernate Search 与 Play Framework 一起使用。它接缝非常简单直接。但我得到一个例外(见下文):
这是我所做的:
我添加了依赖项
"org.hibernate" % "hibernate-entitymanager" % "4.3.8.Final",
"org.hibernate" % "hibernate-search-orm" % "5.2.0.Final",
我已经有了 Entitymanager,它运行良好。
然后我添加了 Hibernate Search 属性:
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
版本="2.0">
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>DefaultDS</non-jta-data-source>
<class>models.User</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.search.default.directory_provider"
value="filesystem"/>
<property name="hibernate.search.default.indexBase"
value="/var/lucene/indexes"/>
</properties>
</persistence-unit>
关于这个的新消息只有:
<property name="hibernate.search.default.directory_provider"
value="filesystem"/>
<property name="hibernate.search.default.indexBase"
value="/var/lucene/indexes"/>
我给用户添加了一些注释:
@Entity
@Indexed
public class User extends Model {
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
public String firstname;
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
public String lastname;
}
我启动服务器并尝试访问站点:
play.api.UnexpectedException: Unexpected exception[AbstractMethodError: org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues()Ljava/util/Map;]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply$$anonfun.apply(ApplicationProvider.scala:170) ~[play_2.11-2.3.7.jar:2.3.7]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply$$anonfun.apply(ApplicationProvider.scala:130) ~[play_2.11-2.3.7.jar:2.3.7]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.4.jar:na]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply.apply(ApplicationProvider.scala:130) ~[play_2.11-2.3.7.jar:2.3.7]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply.apply(ApplicationProvider.scala:128) ~[play_2.11-2.3.7.jar:2.3.7]
Caused by: java.lang.AbstractMethodError: org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues()Ljava/util/Map;
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:404) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final]
感谢您的帮助。
感谢 comments.Seams 中的用户 mhlz 解决了我不得不更新实体管理器。
从 5.0.0 到 5.3.0 的所有 Hibernate Search 版本都与任何 Hibernate ORM 版本兼容 4 .3.x(4.3.0 到最新的 4.3 系列,目前是 4.3.10)。
但是你总是必须为 hibernate-entitymanager 和 hibernate-orm 选择完全相同的版本,因为它们是一起发布的,应该不分不混
从堆栈跟踪来看,您似乎已经在使用 Hibernate ORM 版本 4.3.9 (hibernate-core-4.3.9.Final.jar), 所以你不应该使用 hibernate-entitymanager-4.3.8.Final 但也可以将 EntityManager 升级到 4.3.9 ,或者将 hibernate-core 降级到 4.3.8,或者将两者都升级到 4.3.10(可能是最好的选择)。
Hibernate 兼容性规则
一般来说,hibernate-core 和 hibernate-entitymanager 的版本必须完全相同;然后查阅 Hibernate Search 文档以找出它兼容的范围。
可以在 README, in the reference documentation, or via the pom.xml 中找到此信息(还有许多能够解释 Maven 元数据的工具)。
下载页面中也提到了兼容性:
- http://hibernate.org/search/downloads/
下载页面和 pom 文件只提到了一个特定的 Hibernate ORM 版本(构建它的版本)。
README and reference documentation 指定兼容的版本范围;尽管这些是由人工更新的,因此它有时可能不太准确,但如果这不起作用,请提交错误,因为我们努力保持兼容性范围宽松,尤其是在次要版本中。
此处记录了 Hibernate 的兼容性定义和期望:https://github.com/hibernate/hibernate-orm/wiki/Compatibility-Considerations
我正在尝试将 Hibernate Search 与 Play Framework 一起使用。它接缝非常简单直接。但我得到一个例外(见下文):
这是我所做的:
我添加了依赖项
"org.hibernate" % "hibernate-entitymanager" % "4.3.8.Final",
"org.hibernate" % "hibernate-search-orm" % "5.2.0.Final",
我已经有了 Entitymanager,它运行良好。
然后我添加了 Hibernate Search 属性:
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 版本="2.0">
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>DefaultDS</non-jta-data-source>
<class>models.User</class>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.search.default.directory_provider"
value="filesystem"/>
<property name="hibernate.search.default.indexBase"
value="/var/lucene/indexes"/>
</properties>
</persistence-unit>
关于这个的新消息只有:
<property name="hibernate.search.default.directory_provider"
value="filesystem"/>
<property name="hibernate.search.default.indexBase"
value="/var/lucene/indexes"/>
我给用户添加了一些注释:
@Entity
@Indexed
public class User extends Model {
@Field(index= Index.YES, analyze= Analyze.YES, store= Store.NO)
public String firstname;
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
public String lastname;
}
我启动服务器并尝试访问站点:
play.api.UnexpectedException: Unexpected exception[AbstractMethodError: org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues()Ljava/util/Map;]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply$$anonfun.apply(ApplicationProvider.scala:170) ~[play_2.11-2.3.7.jar:2.3.7]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply$$anonfun.apply(ApplicationProvider.scala:130) ~[play_2.11-2.3.7.jar:2.3.7]
at scala.Option.map(Option.scala:145) ~[scala-library-2.11.4.jar:na]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply.apply(ApplicationProvider.scala:130) ~[play_2.11-2.3.7.jar:2.3.7]
at play.core.ReloadableApplication$$anonfun$get$$anonfun$apply.apply(ApplicationProvider.scala:128) ~[play_2.11-2.3.7.jar:2.3.7]
Caused by: java.lang.AbstractMethodError: org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.getConfigurationValues()Ljava/util/Map;
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:404) ~[hibernate-core-4.3.9.Final.jar:4.3.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54) ~[hibernate-entitymanager-4.3.8.Final.jar:4.3.8.Final]
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) ~[hibernate-jpa-2.0-api-1.0.1.Final.jar:1.0.1.Final]
感谢您的帮助。
感谢 comments.Seams 中的用户 mhlz 解决了我不得不更新实体管理器。
从 5.0.0 到 5.3.0 的所有 Hibernate Search 版本都与任何 Hibernate ORM 版本兼容 4 .3.x(4.3.0 到最新的 4.3 系列,目前是 4.3.10)。
但是你总是必须为 hibernate-entitymanager 和 hibernate-orm 选择完全相同的版本,因为它们是一起发布的,应该不分不混
从堆栈跟踪来看,您似乎已经在使用 Hibernate ORM 版本 4.3.9 (hibernate-core-4.3.9.Final.jar), 所以你不应该使用 hibernate-entitymanager-4.3.8.Final 但也可以将 EntityManager 升级到 4.3.9 ,或者将 hibernate-core 降级到 4.3.8,或者将两者都升级到 4.3.10(可能是最好的选择)。
Hibernate 兼容性规则
一般来说,hibernate-core 和 hibernate-entitymanager 的版本必须完全相同;然后查阅 Hibernate Search 文档以找出它兼容的范围。
可以在 README, in the reference documentation, or via the pom.xml 中找到此信息(还有许多能够解释 Maven 元数据的工具)。
下载页面中也提到了兼容性: - http://hibernate.org/search/downloads/
下载页面和 pom 文件只提到了一个特定的 Hibernate ORM 版本(构建它的版本)。 README and reference documentation 指定兼容的版本范围;尽管这些是由人工更新的,因此它有时可能不太准确,但如果这不起作用,请提交错误,因为我们努力保持兼容性范围宽松,尤其是在次要版本中。
此处记录了 Hibernate 的兼容性定义和期望:https://github.com/hibernate/hibernate-orm/wiki/Compatibility-Considerations