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

2010-10-25

SQLite on SQuirrel

為了要處理 firefox 資料肥大的問題, 得進去firefox 的place.sqlite看一下.
找了一下, 看有沒有 可以在 squirrel上面可以直接 使用的方法.

最簡單就是找到 sqlite jdbc driver 裝上去.
下載
1. SQLiteJDBC

設定

  1. Click on the Drivers tab on the left, and add a new driver

      Name : SQLite Driver
      Example URL : jdbc:sqlite://
      Website URL: http://www.zentus.com/sqlitejdbc/


  2. Click on the Extra Class Path tab. Click the Add button, then navigate and select the sqlitejdbc jar file.
  3. Click List Drivers and org.sqlite.JDBC will appear in the Class Name field.
  4. Click Button[Ok].