具有各种 JPA 版本的复合持久性单元
Composite persistence unit with various JPA versions
我们在同一项目中遇到多个持久性单元的问题。我们需要同时使用两个持久化单元。一个 "normal" 使用 Hibernate for MySQL,另一个使用 Kundera for Cassandra。
问题在于,与 Hibernate/MySQL 不同,Kundera/Cassandra 似乎不支持 JPA 2.1。
持久性 XML 看起来像:
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="pu-mysql" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/datasrc</jta-data-source>
<class>com.blah.Contact</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
<persistence-unit name="cassandra-pu">
<provider>com.impetus.kundera.KunderaPersistence</provider>
<class>com.blah.nosql.PostLogNosql</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="kundera.nodes" value="localhost"/>
<property name="kundera.port" value="9042"/>
<property name="kundera.keyspace" value="keyspace_name"/>
<property name="kundera.dialect" value="cassandra"/>
<property name="kundera.ddl.auto.prepare" value="validate"/>
<property name="kundera.client.lookup.class" value="com.impetus.kundera.client.cassandra.dsdriver.DSClientFactory"/>
<property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider"/>
<property name="kundera.annotations.scan.package" value="com.blah.nosql"/>
<property name="jboss.as.jpa.managed" value="false"/>
</properties>
</persistence-unit>
</persistence>
这没有用。系统没有看到文件的 Kundera 部分,因为 Kundera 不支持 JPA 2.1。我们收到 org.hibernate.HibernateException:缺少列:keyspace_name.ourtable 错误中的 time_key。
这已通过将持久性 header 更改为 2.0 版解决。 header 如下所示:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_0.xsd">
...一切都很顺利。到目前为止一切顺利。
现在,问题是 Hibernate/MySQL 作为 JPA 2.1 兼容会发生什么。它的所有 JPA 2.1 特定功能是否仍然可用,还是仅限于与 JPA 2.0 相关的子集?
如果是后者,我怎么能同时使用 Hibernate/MySQL 作为 JPA 2.1 和 Kundera/Cassandra 作为 JPA 2.0?
使用的应用服务器是Wildfly 8和Wildfly 9,非常感谢
您在 CLASSPATH 中有一个 JPA API jar,因此无论哪种方式都会出现问题。如果您尝试使用 JPA 2.0,那么您可能会在 Hibernate 中遇到 AbstractMethodError 之类的问题,在 JPA 2.1 和 Kundera 中可能会遇到 vice-versa。您可以选择将 DataNucleus 与 Cassandra 一起用于 JPA 2.1(它也支持 RDBMS FWIW)。 persistence.xml header 是你的问题中最少的...... 2.0 就足够了,因为 JPA 2.1
中没有任何变化
我们在同一项目中遇到多个持久性单元的问题。我们需要同时使用两个持久化单元。一个 "normal" 使用 Hibernate for MySQL,另一个使用 Kundera for Cassandra。
问题在于,与 Hibernate/MySQL 不同,Kundera/Cassandra 似乎不支持 JPA 2.1。
持久性 XML 看起来像:
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="pu-mysql" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/datasrc</jta-data-source>
<class>com.blah.Contact</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
</properties>
</persistence-unit>
<persistence-unit name="cassandra-pu">
<provider>com.impetus.kundera.KunderaPersistence</provider>
<class>com.blah.nosql.PostLogNosql</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="kundera.nodes" value="localhost"/>
<property name="kundera.port" value="9042"/>
<property name="kundera.keyspace" value="keyspace_name"/>
<property name="kundera.dialect" value="cassandra"/>
<property name="kundera.ddl.auto.prepare" value="validate"/>
<property name="kundera.client.lookup.class" value="com.impetus.kundera.client.cassandra.dsdriver.DSClientFactory"/>
<property name="kundera.cache.provider.class" value="com.impetus.kundera.cache.ehcache.EhCacheProvider"/>
<property name="kundera.annotations.scan.package" value="com.blah.nosql"/>
<property name="jboss.as.jpa.managed" value="false"/>
</properties>
</persistence-unit>
</persistence>
这没有用。系统没有看到文件的 Kundera 部分,因为 Kundera 不支持 JPA 2.1。我们收到 org.hibernate.HibernateException:缺少列:keyspace_name.ourtable 错误中的 time_key。
这已通过将持久性 header 更改为 2.0 版解决。 header 如下所示:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_0.xsd">
...一切都很顺利。到目前为止一切顺利。
现在,问题是 Hibernate/MySQL 作为 JPA 2.1 兼容会发生什么。它的所有 JPA 2.1 特定功能是否仍然可用,还是仅限于与 JPA 2.0 相关的子集?
如果是后者,我怎么能同时使用 Hibernate/MySQL 作为 JPA 2.1 和 Kundera/Cassandra 作为 JPA 2.0?
使用的应用服务器是Wildfly 8和Wildfly 9,非常感谢
您在 CLASSPATH 中有一个 JPA API jar,因此无论哪种方式都会出现问题。如果您尝试使用 JPA 2.0,那么您可能会在 Hibernate 中遇到 AbstractMethodError 之类的问题,在 JPA 2.1 和 Kundera 中可能会遇到 vice-versa。您可以选择将 DataNucleus 与 Cassandra 一起用于 JPA 2.1(它也支持 RDBMS FWIW)。 persistence.xml header 是你的问题中最少的...... 2.0 就足够了,因为 JPA 2.1
中没有任何变化