2013-09-26 82 views
0

我有兩個表所示:JPA /休眠:生成特定於交易的交易ID和設置成JPA父/子實體

User [ UserId, FirstName, LastName, AddressId (#FK), UITransactionId ] 
Address [ AddressId, city, state, UITransactionId] 

UITransactionId是捕捉特定交易的變化。例如,我有一個添加頁面,可以填寫用戶的名字,姓氏和地址。如果我保存下面的用戶記錄將被添加到表中。

User [ U1, Narendra, Verma , A1 , 1234 ] 
Address [ A1, Pune, MH, 1234] 

的UITransactionId「1234」可以被視爲事務ID和登錄到兩個表作爲用戶信息和地址被保存爲一個事務。現在

如果我更新的用戶名和地址:

User [ U1, NarendraEdit, Verma , A1 , 1255] 
Address [ A1, PuneEdit, MH, 1255] 

的變化在兩個表單事務中的這一次「1255」標識將代表。

現在,如果我改變的唯一地址,並保存用戶信息:

User [ U1, Narendra, Verma , A1 , 1255 ] 
Address [ A1, Pune, MHEdit, 1295] //Only this table is updated 

這次「1295」應該只投資於地址表,becase的我們還沒有更新的用戶信息,但只有地址。

其他方式我可以生成特定於JPA事務的事務ID並設置爲JPA父/子實體?

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class }) 
    public void saveUser(UserVO userVO) { 
    // Setting transaction Id into User/Address Entity 
    // Call dao layer to save/update entity 
    } 

有同時進行交易,並明確設置爲每個實體,同時節省/更新特定的實體,我可以生成服務的隨機數的方法之一。但是這種方法需要在每個地方爲每個實體設置UITransactionId。有沒有適當的方法來實現這一點?

回答

0

我得到了很好的跟蹤交易ID的解決方案。我不需要在應用程序級別跟蹤事務ID。我正在使用更新/刪除觸發器,以便在我的表更新時存儲審計相關信息。 Oracle觸發這些事務在單個事務中執行,它們也在相同事務下執行。我可以在觸發器中使用'dbms_transaction.local_transaction_id'獲取事務ID,並在記錄其他審計相關信息時記錄此事件。

0

不知道我的答案是否有幫助,但這看起來有點像JPA的樂觀鎖定版本,除了默認情況下每個實體都有自己的版本增加。如果可以將JPA實現配置爲使用事務ID作爲樂觀鎖定版本,那麼問題可能會得到解決。