2015-09-05 42 views
0

我們在同一個項目中存在多個持久性單元的問題。我們需要在同一時間使用兩個持久性單元。一個用Hibernate for MySQL的「正常」,另一個用Kundera for Cassandra。具有各種JPA版本的複合持久性單元

問題是,與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> 

這沒有奏效。由於昆德拉不支持JPA 2.1,系統沒有看到昆德拉文件的一部分。我們得到org.hibernate.HibernateException:Missing column:time_key in keyspace_name.ourtable error。

這是通過將持久性標題更改爲版本2.0解決的。標題然後看起來如下:

<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.非常感謝。

+1

你在CLASSPATH中有一個JPA API jar,所以會出現任何問題。如果您嘗試使用JPA 2.0,那麼您可能會使用Hibernate獲取AbstractMethodError等,反之亦然,使用JPA 2.1和Kundera。你可以選擇像DataNucleus和Cassandra一樣使用JPA 2.1(也可以使用RDBMS FWIW)。 persistence.xml頭是你的問題最少... 2.0是足夠的,因爲在JPA 2.1 –

+0

沒有任何變化你好@尼爾斯托克頓,謝謝你,這應該是一個有效的答案。我們終於在別處解決了這個問題,但是,您的解釋是有價值的。 – TomS

+0

@TomS我不認爲這個問題是因爲「Kundera不支持JPA 2.1」,因爲我試圖使用Kundera與持久性頭版本2.1,它的工作原理!另外,你能分享你的問題如何解決? –

回答

1

CLASSPATH中有一個JPA API jar,所以會出現問題。如果您嘗試使用JPA 2.0,那麼您可能會使用Hibernate獲取AbstractMethodError等,反之亦然,使用JPA 2.1和Kundera。你可以選擇像DataNucleus和Cassandra一樣使用JPA 2.1(也可以使用RDBMS FWIW)。 persistence.xml頭是你的問題最少... 2.0是足夠的,因爲沒有任何變化,在JPA 2.1