[英]Transactions with Hibernate in Apache Karaf / OSGi
我們正在開發一套模塊(希望)部署在Apache Karaf中。 每個模塊都有一個分層結構,從域JPA實體/ DAO,服務,Web組件等開始,其中每個層都變成一個不同的OSGi包。
JPA實體擴展了屬於公共捆綁包的某些抽象超類型。 問題來了..
由於在學習Karaf和OSGi的方式時OpenJPA經常被“宣傳”,因此我們首先嘗試了它。 由於我們的實體層次結構跨越多個捆綁(罐):幾個PU和抽象超類型,因此編譯時增強是一場災難,並且是對時間的完全浪費。 即使有效,恐怕OpenJPA增強功能也要求我們用相同的Java和OpenJPA版本編譯所有模塊,這在以后可能很難看,而每個模塊將以不同的速度進行開發。
然后,我們研究了Hibernate,並通過一些教程使它得以運行(看來不太流行)。 但是,盡管所有持久性單元均為transaction-type =“ JTA”,但數據源通過JNDI屬於JTA類型,並且DAO CRUD方法被標記為Blueprint,例如,DAO保存方法應僅包含以下內容:
EntityManager 。 堅持 (帳戶)
僅在后面跟隨時有效
EntityManager 。 沖洗 ();
我期望更改在事務結束時自動刷新(即,在save方法的末尾-當前事務結束邊界)
如果我們在persist之后添加flush(),但隨后拋出運行時異常,則整個save方法都不會回滾。
日志中沒有錯誤,在調試級別檢查它會顯示
為事務[Xid:globalId = ffffffca2d6dfffffff ...]創建了一個新的持久性上下文org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d ...
...
由於自動加入檢查,跳過了JTA同步注冊
...
事務完成后,清除EntityManager org.apache.aries.jpa.container.impl.EntityManagerWrapper@42e4823d。
因此有一個事務,但是它沒有將更改推送到數據庫而結束。
順便說一句,沖洗模式設置為自動。
謝謝您的提示。
由於Hibernate團隊進行了一些改進,以使Hibernate可以在OSGi上更平穩地運行,因此您可以考慮使用最新的Hibernate版本,不確定該版本是否已經發布。
我建議使用EclipseLink來簡化OSGI集成。
我曾經將JPA與OSGI一起使用。 我從OpenJPA開始,遇到問題后切換到了Hibernate,最后我使用EclipseLink解決了其他問題。
希望能幫助到你
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.