2010-10-28

Eclipse Link JPA on jboss

之前使用 jpa + jta 的時候, 使用到transaction commit 時, 沒有詳細去注意各個 jpa 時做的問題. 但是, 今天就遇到一個問題, 讓目前開發的時候, 如果針對同一個 table 要作資料更新, 才發現不一樣的 jpa 實做會有不一樣的結果.
同一份 EJB 的程式放在 Jboss 6.0 and weblogic 會有不一樣的結果. Jboss 會出現 rollback , 但是 weblogic 不會. 這下又有趣了.
還好, 從Exception 中我看到 jboss 是 org.hibernate 的Exception. 就讓我想到會不會是 jpa 實做的不同導致的. 果然, weblogic 不是採用 hibernate jpa , 是用 eclipse link jpa.
有了這一條線索, 就上網找資料如何讓 jboss 可以採用 eclipse link jpa. EclipseLink/Examples/JPA/JBoss Web Tutorial 這一篇有講到, 但是有一些不一樣.
整個做完以後, eclipselink 做的 有些地方比 hibernate 好.

作法
  1. 下載 eclipse link jpa
  2. 將 eclipselink.jar 放入 ${jboss_home}/server/${server_name}/lib (這邊個上面的文章放的地方不太一樣, 因為我放過 有問題)
  3. 修改
    persistence.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
    <persistence-unit name="DefaultDB" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:jdbc/DefaultDB</jta-data-source>
    <class>entity.testBean</class>
    <properties>
    <property name="eclipselink.target-server" value="JBoss"/>
    <property name="eclipselink.target-database" value="Oracle"/>
    </properties>
    </persistence-unit>
    </persistence>


provider 之前沒有設定 jboss 會直接抓 container server 的, 現在在這邊指定就可以讓jpa 使用設定的 jpa implements.

eclipselink.target-server 這一個設定值一定要做, 尤其在 jboss server上面, 前沒有做的時候. 一直跑出 No Transaction is currently. 應該是沒有設定 eclipselink 沒有辦法去抓到 jboss xa manager.
eclipselink.target-database 這一個建議要設定, 開始的時候使用Oracle 沒有設定是沒有問題的. 但是轉成 MSSQL 後, 就會有問題. 設定值參考 Sun GlassFish Enterprise Server v3 Prelude Developer's Guide , Chapter 6 Using the Java Persistence API -Specifying the Database 裡頭有各家 DB 的設定值.



詳細問題
在Oracle 設計Table 的時候, 除了會設定primary key 以外, 還可針對欄位作一些 check rule. 現在遇到問題就是, 當我要作一筆 Transaction, 所做的動作為 :
  1. 找尋就有資料是否有存在的組合.
  2. 有符合的資料, 就將資料欄位 isAtvice 從 true 改為 false.
  3. Insert 新的資料進去
在weblogic 中, 這樣一個transaction 是可以完成的. 但是轉換到 jboss 時, 會出現 check rule Exception.
問題後來發現就是出在 hibernate 在處理 transaction 的方法, 跟 eclipselink 處理不同, 所以相同的DB 會出現不同的結果.

參考文獻
  1. Integrating EclipseLink with an Application Server (ELUG)
  2. EclipseLink/Examples/JPA/JBoss Web Tutorial
  3. Sun GlassFish Enterprise Server v3 Prelude Developer's Guide , Chapter 6 Using the Java Persistence API -Specifying the Database

沒有留言:

張貼留言