簡體   English   中英

在Apache Karaf / OSGi中與Hibernate進行交易

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM