在使用EclipseLink和DB上的所有業務邏輯的3層Web項目中,我需要在每個存儲的調用之前和之後執行存儲過程,無論是過程還是函數,都在同一個會話中。這是一個管理決定,我對此無能爲力。 所以我轉向session customization with Event Listeners,但它不工作。EclipseLink會話自定義 - 錯誤
這裏是我在Session Customizer中的代碼: 注意:「wrapper」是一個自定義類,它包裝了一個StoredProcedureCall,「log」是一個log4j Logger。
SessionEventAdapter adapter = new SessionEventAdapter() {
@Override
public void preExecuteQuery(SessionEvent event) {
log.debug("Setting environment parameters before query execution.");
[some business code...]
StoredProcedureCall call = wrapper.generateCall();
DatabaseQuery query = new DataModifyQuery(call);
event.getSession().executeQuery(query);
preExecuteQuery(event);
}
@Override
public void postExecuteQuery(SessionEvent event) {
log.debug("Releasing environment parameters after query execution.");
[some business code...]
StoredProcedureCall call = wrapper.generateCall();
DatabaseQuery query = new DataModifyQuery(call);
event.getSession().executeQuery(query);
postExecuteQuery(event);
}
};
session.getEventManager().addListener(adapter);
我得到的是記錄的該行「設置環境參數......」被重複不少於600-800倍,然後我得到一個堆棧溢出錯誤。我不知道爲什麼preExecuteQuery無限循環。我錯過了什麼嗎?據我所知,我做的和EclipseLink wiki中的完全一樣。在你問之前,行爲是否與最後一行preExecuteQuery(event);
相同。
我還假設使用preExecuteQuery和postExecuteQuery事件是在每次查詢前後都將調用放入同一會話的正確位置,但也許我錯了。我也會嘗試PostAcquireUnitOfWork和PreCommitUnitOfWork事件。
任何想法?感謝您的幫助。
你說得對,謝謝。 – Alessandro 2011-03-28 09:25:41