Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在JPA实体中自动设置createdBy和updatedBy_Hibernate_Spring_Jpa_Stripes - Fatal编程技术网

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

Hibernate 在JPA实体中自动设置createdBy和updatedBy,hibernate,spring,jpa,stripes,Hibernate,Spring,Jpa,Stripes,我正在开发一个JPA(的Hibernate实现)、Spring和Stripes web应用程序。我有许多JPA实体,它们具有以下用于审计和查询目的的共同字段: createdBy—创建实体的人员的用户ID。 createdOn—实体创建的日期 updatedBy—上次更新实体的人员的用户ID UpdateOn—上次更新实体的日期 我已经让我的应用程序工作,这样当实体被持久化时,createdOn和updatedOn会自动设置,但我不确定如何在不必通过当前登录的用户ID从控制器类一直传递到DAO的

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

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

我已经让我的应用程序工作,这样当实体被持久化时,createdOn和updatedOn会自动设置,但我不确定如何在不必通过当前登录的用户ID从控制器类一直传递到DAO的情况下获得createdBy和updatedBy字段

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


谢谢

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

(即使您没有使用EJB,这些帖子可能仍然是相关的。但是,第二篇帖子只有在您将Spring与JTA一起使用时才有意义)

我个人不赞成这些方法,因为我认为有两个问题:

  • 可测试性:需要在测试中设置上下文数据
  • 契约:上下文数据参与契约以使用实体,但在界面中不清晰可见
“到处”传递用户ID似乎是一项艰巨的工作,但我认为这更干净

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

我会创建这样一个类:


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

  //getters and setters

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

我认为ThreadLocal可能是在我的应用程序中实现这一点的最干净的方法。

是的,我已经有了类似的东西-我的问题是我不想从控制器层传入变量-但看起来我可能不得不这样做。你不想在控制器中设置createdBy和updatedBy,然后再将其持久化?你使用了什么机制来检查对象是否脏,所以你设置了
updateBy/At
字段?我问了相关问题,请结帐: