您的位置:首页 > 编程语言 > Java开发

实战记录:从EclipseLink迁移到Hibernate上(1)替换

2016-06-03 17:29 579 查看

前言

正在做的项目因为用了比较老,所以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上,必然有代码的改动
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate eclipselin jboss