2012-12-12 173 views
3

是否可以在每次刷新數據庫之前更新某個列?我有modifiedOnmodifiedBy列,並且希望在每次數據庫更新時更新它們,類似於數據庫觸發器。 JPA有可能嗎?刷新前修改實體

回答

1

免責聲明:以下僅適用於Hibernate/JPA。

您可以使用JPA更新modifiedOn屬性是這樣的:

public class Entity { 

    private Date modifiedOn; 

    @PreUpdate 
    @PrePersist 
    public void updateModified() { 
     modifiedOn = new Date(); 
    } 
} 

至於modifiedBy,這是一個有點棘手,因爲JPA規範鼓勵在生命週期回調方法的其他實體的引用。此外,您需要了解當前用戶的一些知識,這可能屬於服務層。

你可以使用一個EntityListener這樣的(然而,這仍然採用了回調方法)

@Entity 
@EntityListeners({MyListener.class}) 
public class MyEntity { 
    Date modifiedOn; 
    User modifiedBy; 
    ... 
} 

一個在EntityListener:

public class MyListener { 

    CurrentUserProvider provider; // Implement this and make sure it is set 

    @PreUpdate 
    @PrePersist 
    public void updateModifier(MyEntity entity) { 
     entity.setModifiedOn(new Date()); 
     entity.setModifiedBy(provider.getCurrentUser()); 
    } 
} 
+0

你試試這個?它對你有用嗎? – Oliv

+1

我讀過它在我目前使用的EclipseLink中不起作用。看到這裏:http://stackoverflow.com/a/1877631/952135 – Oliv

+0

這就是我們如何在JPA2.0 + Hibernate + Spring上做到這一點。不確定EclipseLink是否支持它。 – RJo

-1

顯然,JPA具有在規範中定義的實體回調,例如@PrePersist,@PreUpdate。簡單的規範修訂會給你更多的細節