我有我的消息驅動的Bean注入的EntityManager使用的Spring bean作爲服務(引導與的SpringBeanAutowiringInterceptor做了一個問題EJB與春天:在JPA沖洗交易問題
下面是代碼:
@MessageDriven(name = "ProcessMDB")
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class ProcessMDB implements MessageListener {
@Autowired
private ProcessService processService;
@Override
public void onMessage(Message message) {
try {
id = message.getLongProperty("ID");
processService.process(id);
} catch (Exception e) {
// Handle error.
}
}
流程服務具有其中的EntityManager注入與註釋@PersistentContext一個DAO ...
的問題是,如果在processService發生JPA誤差,也可以在entityManager.flush期間可能發生它( )調用...所以try catch塊消失了,// Handle錯誤的東西沒有完成。
所以我試圖手動添加刷新。
@MessageDriven(name = "ProcessMDB")
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class ProcessMDB implements MessageListener {
@Autowired
private ProcessService processService;
@PersistenceContext
private EntityManager em;
@Override
public void onMessage(Message message) {
try {
id = message.getLongProperty("ID");
processService.process(id);
em.flush();
} catch (Exception e) {
// Handle error.
}
}
但似乎沖洗沒有效果。
我嘗試添加em.flush底層DAO(剛過持續實例)和它的作品!異常被提出並且catch塊被執行。但是,如果將em.flush()放在MessageDrivenBean級別,它就不起作用。
我認爲這是事務管理問題......春豆EntityManager的是不在同一TX比我的EJB注入實體管理器。
如果我讓在onMessage()方法em.find,所獲取的對象保存舊值(一個數據庫中),而不是在服務方法改變的值。
<jee:jndi-lookup id="emf" jndi-name="persistence/PUnit" />
和我的TX經理如下::
<tx:annotation-driven/>
<tx:jta-transaction-manager />
什麼我錯了
的後跟我已配置我的數據庫?
有人可以幫我嗎?
感謝
斯特凡
這使感官。但是由於我在同一個事務中,我期望容器在ProcessService和ProcessMDB中都提供相同的「共享」實體管理器。如果我做了。在MDB中查找(id),返回的對象具有來自DB的值,而不是在processService中更新的最後一個值(因爲沒有執行刷新)... –
@StéphaneProcessService.process()的事務屬性是什麼 –
默認值:必需。 –