前言
正在做的项目因为用了比较老,所以JTA居然还用老古董的EclipseLink,这玩意曾经把我坑惨,比如:
JBoss会莫名其妙的偶现’eclipseLink Module not found’而导致PU无法persistence,从而导致整个EAR无法deploy的问题(虽然我不确定是不是和EclipseLink有关)。又比如:
系统中集成了jBpm之后,由于jbpm用的是另外一个datasource,jta用的是hibernate,整个软件同时存在两个datasource,两个jta,多个persistence.xml,这个导致复杂的transaction控制问题,不得不用web api封装jbpm才算是workaround过去。
所以我就一直想把eclipseLink换成hibernate,无奈一开始评估工作量太多,一直没有开始。昨天闲来无事,把这个事情做了,花了一天半的时间,系统终于迁移到了hibernate上,算是功德一件,在这里给大家share一下。不过因为每个软件的设计不一样,这篇文章只是我个人的记录,对大家不一定会起到很多帮助作用,看客们权当看着玩玩吧。
persistence.xml
首先来改一下persistence.xml,主要是改jta的provider和properties.(以下改动是针对所有包含了eclispelink的persistence.xml)
old persistence.xml
src:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/aswuDS</jta-data-source>
<properties>
</properties>
test:
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/aswuDS</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value="sa"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1"/>
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.ddl-generation.output-mode"
value="database"/>
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
</properties>
new persistence.xml
src:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/aswuDS</jta-data-source>
<properties>
</properties>
test:
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/aswuDS</jta-data-source>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value="sa"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:mem:test_db;DB_CLOSE_DELAY=-1"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.max_fetch_depth" value="3"/>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.id.new_generator_mappings" value="false"/>
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
</properties>
POM.xml
去掉eclipseLink,引入hibernate, .(以下改动是针对所有包含了eclispelink的pom.xml):寻找之前pom所有有”< artifactId>eclipselink< /artifactId>”的地方,替换为了hibernate-core和hibernate-entitymanager两个包;而所有有eclipse.javax.persistence的地方,替换为hibernate-jpa-2.1-api。这里我特意exclusion了antlr,否则hibernate会要求增加更多的dependency,在这里对我来说是不必要的。
old pom.xml
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>${eclipselink.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>${javax.persistence.version}</version>
</dependency>
<dependency>
new pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
</exclusion>
</exclusions>
<dependency>
<dependency> <groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>${hibernate.jpa.api.version}</version>
</dependency>
修改完了以上这些算是完成了第一步,接下来的调试才是重头戏,因为虽然eclipselink和hibernate都实现了javax.persistence的接口,但实际上他们还是有区别的,之前的代码都是按照eclipselink的实现来写的,现在转到hibernate上,必然有代码的改动