在JPA实体中自动设置createdBy和updatedBy

时间:2009-12-08 07:51:56

标签: hibernate spring jpa stripes

我正在开发一个JPA(Hibernate实现),Spring和Stripes Web应用程序。我有许多JPA实体,它们在审计和查询方面具有以下共同字段:

createdBy - 创建实体的人员的用户ID。 createdOn - 创建实体的日期 updatedBy - 上次更新实体的人员的用户ID updatedOn - 实体上次更新的日期

我的应用程序正常工作,以便在实体持久化时自动设置createdOn和updatedOn但我不知道如何填充createdBy和updatedBy字段而不必通过当前登录用户的ID从控制器类到DAO的所有方式。

有没有人有任何关于如何在不传递所有地方的用户ID的情况下这样做的建议?请注意,当前用户ID目前存储在HttpSession对象中,因此我的后端需要以某种方式访问​​此数据...

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以查看其中一种方法,将用户ID作为业务层中的上下文传递:

(即使你没有使用EJB,这些帖子仍然可能是相关的。第二篇文章只有在你使用带JTA的Spring时才有意义)

我个人不鼓励这些方法,因为我认为它有两个问题:

  • 可测试性:需要在测试中设置上下文数据
  • 合同:上下文数据参与合同以使用实体,但在界面中不清晰可见。

将“用户ID”“遍布整个地方”似乎是一项重要的工作,但我认为它更清晰。

要在创建或更新实体时自动设置日期和用户ID,您可以使用EntityListener or lifecycle callbacks(也许您已经这样做了)。 希望它有所帮助...

答案 1 :(得分:1)

我已经确定ThreadLocal可能是我应用程序中最干净的方法。

答案 2 :(得分:0)

我会创建一个这样的类:


@MappedSuperclass
public abstract class AuditableDomainClass {
  private long createdBy;
  private long updatedBy;

  //getters and setters

具有您所描述的要求的实体类只会扩展此类,您可以在需要的层中设置变量(例如控制器),您不需要一直担心它在DAOs中。