6

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

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

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

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

谢谢!

4

3 回答 3

3

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

(即使您不使用 EJB,这些帖子可能仍然是相关的。第二个帖子才有意义,但前提是您将 Spring 与 JTA 一起使用)

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

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

“到处”传递用户 ID 似乎是一项艰巨的工作,但我认为它更干净。

要在创建或更新实体时自动设置日期和用户 ID,您可以使用EntityListener 或生命周期回调(也许您已经这样做了)。希望能帮助到你...

于 2009-12-08T08:06:01.793 回答
1

我已经决定 ThreadLocal 可能是在我的应用程序中执行此操作的最干净的方法。

于 2011-04-16T15:26:30.847 回答
0

我会创建一个这样的类:


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

  //getters and setters

具有您所描述的要求的实体类将简单地扩展此类,您可以在需要的层中设置变量(例如控制器),并且您无需一直担心它DAO。

于 2009-12-08T14:01:17.907 回答