Java 如何在实体更新时设置用户id?

Java 如何在实体更新时设置用户id?,java,hibernate,jpa-2.0,Java,Hibernate,Jpa 2.0,我有一个带有updatedAt和updatedBy审计字段的实体。我只想在实体状态更改时设置此字段。因此,对于脏检查,我可以使用Hibernate EmptyInterceptor接口重写onFlushDirty方法或JPA listeners@PreUpdate。但如何在拦截器或侦听器中获取当前用户ID呢?我想到了两种解决方案: 将userId传递给DAO层,这样我就可以创建传递给它的自定义拦截器构造函数userId,然后在创建新会话时使用这个拦截器 将当前userId设置为publicsta

我有一个带有updatedAt和updatedBy审计字段的实体。我只想在实体状态更改时设置此字段。因此,对于脏检查,我可以使用Hibernate EmptyInterceptor接口重写onFlushDirty方法或JPA listeners@PreUpdate。但如何在拦截器或侦听器中获取当前用户ID呢?我想到了两种解决方案:

将userId传递给DAO层,这样我就可以创建传递给它的自定义拦截器构造函数userId,然后在创建新会话时使用这个拦截器

将当前userId设置为publicstaticthreadlocal变量,这样我就可以从任何地方访问它

但我认为这两种方法都很丑陋。那么有没有更优雅的方法来解决我的问题呢

请注意,我不能使用Envers库,因为它不符合我们的项目要求


谢谢

我建议在用户进行身份验证时将Person对象存储在Http会话中。通过这种方式,您可以从会话中获取它,并使用实体管理器中的合并功能将其转换回附着的实体

我个人还将实体分配给dao中需要的域对象,并且不使用@PreUpdate,因为我不想让实体知道如何检索当前用户对象