2011-06-08 32 views
1

使用hibernate 3.3.2.ga和Spring 3.0.5.RELEASE。Hibernate DefaultSaveOrUpdateEventListener檢查插入和更新數據庫事件

有描述here實現的東西..

有不同的配置,因爲我; M用Spring管理SessionFactory的

<bean id="sessionFactoryPGAD" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSourcePGAD"/> 
....... 
....... 
<property name="eventListeners"> 
    <map> 
     <entry key="save-update"><ref local="auditEntityListener" /></entry> 
    </map> 
</property> 

加時,我的DAO調用

審計
...getCurrentSession().saveOrUpdate(... 

但是在我擴展的DefaultSave OrUpdateEventListener(bean名爲auditEntityListener)我想知道是否有任何方法來確定被保存到數據庫的對象是新記錄還是更新到存在?

我試着尋找

EntityEntry entityEntry = event.getEntry(); 
if (entityEntry.isExistsInDatabase()) 
{..... 

但entityEntry爲空,因爲我知道一個實體在數據庫中存在。

SaveOrUpdateEvent上的其他方法,如getRequestedId()和getResultId()也會返回null。

我如何確定hibernate調用是否是從DefaultSaveOrUpdateEventListener插入或更新?

回答

0

您正在尋找的方法是getEntityState()。下面是從源代碼中採取DefaultSaveOrUpdateEventListener使用它的一個例子:

int entityState = getEntityState(
    event.getEntity(), 
    event.getEntityName(), 
    event.getEntry(), 
    event.getSession() 
); 

switch (entityState) { 
    case DETACHED: 
     entityIsDetached(event); 
     return null; 
    case PERSISTENT: 
     return entityIsPersistent(event); 
    default: //TRANSIENT or DELETED 
     return entityIsTransient(event); 
} 

如果你需要做一些不同的保存與更新,你可能要考慮有獨立的事件偵聽器,一個擴展DefaultSaveEventListener和一個擴展DefaultUpdateEventListener,並允許Hibernate爲你分派正確的監聽器。

+0

謝謝你 - 我確實最初有2個監聽器正在監聽預插入和預更新事件(使用提供的接口),但事件監聽器沒有得到任何事件,因爲只有save-update事件被觸發爲我的DAO調用.getCurrentSession()。saveOrUpdate(... 如果唯一的事件是保存更新事件,我將如何獲得hibernate調度到正確的偵聽器? – n99 2011-06-09 10:04:29

+0

也調用getEntityState(event.getEntity() ,event.getEntityName(),event.getEntry(),event.getSession())不像event.getEntry()那樣工作,因爲它像檢查上面提到的if(entityEntry.isExistsInDatabase())時那樣引發NPE。 ....... – n99 2011-06-09 14:46:36

+0

沒有看到你所有的上下文代碼,這聽起來像你的實體可能會在你調用saveOrUpdate時被分離。 r getEntityState()來查看它是如何工作的:http://www.docjar.com/html/api/org/hibernate/event/def/AbstractSaveEventListener.java.html – 2011-06-09 17:33:42

相關問題