2011-05-30

[JEE] 降低 @Remote @Local 新增修改 Method 的方法

之前, 開始寫Session Bean 時, 按照最原始的方法. 定義兩個一模一樣的 Session Interface.
寫了兩個 SessionRemote and SessionLocal 的 Session Interace , 實做時 impelements SessionRemote, SessionLocal. 但是, 一旦要新增或刪除 method 時, 得兩個Interface 都要作修改, 有點麻煩.
EJB 3 in Action p.89, 有另外一種方法. 就是寫好一個SessionManager , 再寫 SessionManagerRemote extends SessionManager, SessionManagerLocal extends SessionManager.

@Remote(SessionManagerRemote.class)
@Stateless
public class SessionManagerBean implements SessionMAnager
{
....
}


上面的寫法, 會多一個SessionManager Interface. 好處是只要修改一個 Interface 就可以了

[JPA] MSSQL 跟 Hibernate JPA 比較和

之前, 開發都是在Oracle + EclipseLink JPA. 整個使用上都沒有問題. 但是直到, 要把整套移植到 MSSQL 上面時, 就會出現一些問題.
原有的邏輯.
1. doc1 = em1.perserient(doc1) // (會產生 doc1的ID , 由資料庫產生, 不透過程式)
2. doc2.setDoc1Id(doc1.getId()) // 設定 doc1 doc2 reference
3. doc2 = em2.perserient(doc2) // 存放 Doc2
4. transaction commit

在 Orcale + eclipseLink Jpa 活的好好的.
一移植到 mssql 後, doc2.getDoc1Id 會是 null.
不過, 改用 hibernate jpa 以後, 程式就可以順利過關, 暫時只能先這樣. 以後有研究在討論

2011-05-18

[JPA] 多個EntityManager Transaction Commit 的Insert Select 問題

[狀況]
最近寫到一個 business logic , 大致的邏輯是這樣
1. Insert Data To TableA
2. Insert Data To TableB
3. Insert Data to TableC Where Select Data From TableA join TableB

之前寫過一次, 用 eclipse JPA 可以在同一個 transaction 中完程. 如果採用 Hibernate 則 第三個步驟是沒有辦法產生的. 所以之前問題有解決.

不過今天遇到, EntityManagerA for 1,3, EntityManagerB for 2.
在同一個 transaction 中, TableC 只會有 TableA 的資料, 不會出現TableB

[實驗結果]
在第一個 transaction 中, 只包含 1, 2 , 第二個transaction 包涵 3 . 則 TableC 中會出現該有的資料, 而不會有遺漏