2011-10-20 54 views
2

我已經找到了答案技術下面非常有用的透明管理的實體創建和更新的時間戳:透明地記錄在JPA實體的最後修改用戶

hard time setting autogenerated time with hibernate JPA annotations

我想知道,如果有什麼類似於記錄實體的創建和更新用戶?

@PreUpdate 
@PrePersist 
public void updateAudit() { 
    lastModifiedDate = new Date(); 
    lastModifiedUser = ??; 
    if (dateCreated==null) { 
     dateCreated = new Date(); 
     userCreated = ??; 
    } 
} 

儘管在示例新Date()提供當前時間,我有這是訪問來自@PrePersist註解的方法上的實體很難找到,其中用戶ID可被存儲的位置(在登錄時) 。

@Produces方法注入@LoggedInUser將是理想的,但是我的實體是由new()創建的,而不是通過注入來創建,因此無法進行管理。

我很新,所以我希望我失去了一些明顯的東西。謝謝。

[編輯]回答以下從prunge導致代碼(有刪節)

@MappedSuperclass 
public abstract class BaseEntity implements Serializable, Comparable<BaseEntity> { 

    @Version 
    private Timestamp updatedTimestamp; 

    private static ThreadLocal<Long> threadCurrentUserId = new ThreadLocal<Long>(); 

    /* Called from entry point like servlet 
    */ 
    public static void setLoggedInUser(BaseEntity user) { 
     if (user!=null) threadCurrentUserId.set(user.getId()); 
    } 

    @PrePersist 
    @PreUpdate 
    protected void onCreateOrUpdate() { 
     //Note we don't have to update updatedTimestamp since the @Version annotation does it for us 
     if(createdTimestamp==null) createdTimestamp = new Timestamp(new Date().getTime());; 

     lastUpdatedByUserId = threadCurrentUserId.get(); 
     if(createdByUserId==null) createdByUserId = lastUpdatedByUserId; 
    } 
+0

你想要捕獲什麼用戶名?這是一個:網絡應用程序?胖客戶端?你使用的是什麼,如果有的話,安全框架? – MarkOfHall

回答

0

如果它是一個Web應用程序,你可以使用一個ThreadLocal存儲當前用戶。

  • 將ThreadLocal值設置在servlet過濾器中,從servlet請求讀取用戶。
  • 從您的JPA實體讀取ThreadLocal值。
  • 通過過濾器清除行程中的值。
+0

謝謝prunge,這很好。 – Jonathan

0

您可以手動注入使用自定義CDI注射器CDI的依賴,我想沿着線的東西:

@Inject 
private BeanManager beanManager;  

... 

Entity entity = new Entity(); 

AnnotatedType<?> type = beanManager.createAnnotatedType(class); 

InjectionTarget target = beanManager.createInjectionTarget(type); 
CreationalContext context = beanManager.createCreationalContext(null); 

target.inject(entity, context); 

注意,實體不會成爲CDI託管bean,但會得到其所有的依賴注入(這些將由cdi管理)。

話雖如此,根據您使用的網絡/安全框架,可能有更好的方法來做到這一點。