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

前言

正在做的项目因为用了比较老,所以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上,必然有代码的改动

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值