当前位置: 首页 > 知识库问答 >
问题:

用于用户输入的Hibernate Envers自定义字段

濮冠宇
2023-03-14

我使用Spring Boot和Hibernate Envers自定义RevsionEntityRevsionListener来存储用户名、ip等附加信息。它工作正常。

作为一个新的需求,我还需要存储来自用户的修改注释。因此,如果用户更改了实体,他/她还需要输入此更改的原因。此文本应保存在其他修订信息中。

我的控制器服务类中都有文本,但是如何用这些信息填充修订侦听器

共有1个答案

羊舌诚
2023-03-14

您的问题的理想答案取决于您当前使用的Hibernate和Spring框架的版本,这两个版本都添加了一些新功能,使得将应用程序状态注入RevisionListener回调非常容易获得。

如果您使用的是Hibernate 5.2或更早版本,那么您将仅限于使用ThreadLocal变量注入应用程序状态的传统方法。在web应用程序中,这可以通过设置web筛选器或作为web控制器的一部分来轻松完成。

目标是在调用执行持久性操作的任何业务服务/bean之前初始化ThreadLocal,并在提交持久性操作后清除状态。由于大多数基于spring的应用程序倾向于将服务方法包装在@Transactional注释中,因此在控制器中处理ThreadLocal的初始化和清除似乎是合乎逻辑的。

由于ThreadLocal是一个全局变量,其作用域为正在执行的线程,因此侦听器将能够向线程本地实例请求该值,以便在自定义修订实体上设置该值。最重要的是在持久性操作开始之前设置它,并在保存后清除它。

这可能不适用于您,因为您处于Spring环境中,但是为了所有可能的配置选择的完整性,我将包含它。

如果您在基于CDI的环境中使用Hibernate 5.3或更高版本,Hibernate添加了对CDI注入的默认支持,基本上允许Hibernate创建的某些对象实际成为CDIBean,并支持将状态注入其中。换句话说

public class CustomRevisionListener implements RevisionListener {
  @Inject
  private UserReasonBean reasonBean;

  @Override
  public void newRevision(Object revisionEntity) {
    // inside this method, you can get the reason from the injected reasonBean
    // and now set the reason on the custom revision entity instance.
  }
}

为了让Spring框架bean注入工作,您必须使用Spring框架5.1或更高版本,在那里他们添加了支持,否则在Hibernate中使用Spring框架5.0或之前版本时,您必须使用带有ThreadLocal变量的遗留方法。

请参见使用Hibernate 5.2或之前版本

如果您在SpringFramework5.1或更高版本中使用Hibernate5.3或更高版本,那么您很幸运。在这个用例中,您可以自动模拟默认的CDI支持,因为SpringFramework5.1提供了自己的BeanRegistry实现,并将其自动连接到Hibernate的框架中。简而言之,这意味着您可以轻松地将SpringBean自动连接到RevisionListener中,就像使用CDI一样。

public class CustomRevisionListener implements RevisionListener {
  @Autowired
  private UserReasonBean reasonBean;

  @Override
  public void newRevision(Object revisionEntity) {
    // inside this method, you can get the reason from the injected reasonBean
    // and now set the reason on the custom revision entity instance.
  }
}
 类似资料:
  • 问题内容: 我的扩展程序具有一个包含项目的上下文菜单。我想要做的是:右键单击html元素(例如,输入或文本区域),然后选择并单击菜单中的某个项目时- 由扩展名定义的某些值将输入到输入中。 目前,我已经意识到。 简单的输入就可以了。 当存在具有自定义事件处理的输入(例如日历或电话输入或货币输入)时,问题就开始了,这些输入以某种方式转换了用户输入。 由于我直接在元素上设置了一个值-省略了处理逻辑,这会

  • 用户自定义 本章讲介绍一些开发过程中常用需要自定义的东西。 一、自定义404页面 一般比较完整的站点,都会有自定义的404页面,既美观统一、又能保持访问者不至于因为错误页面而退出网站。 比如说duowan.com的404页面,是一个坦克大战的小游戏,可以在线玩并且成绩还会进入排行榜,和其他网友一较高下。 对404错误页面的建议: 建议不要使用PHP动态页面,纯HTML页面会比较好。 具特色,但不能

  • 我正在设置一个,它在用户输入整数之前一直执行。但是,按照我现在的方式,循环在输入整数后再次打印消息,然后程序正常执行。有人能建议一种方法来使输入整数后不再打印该消息吗?谢了!

  • 本文向大家介绍Django自定义用户表+自定义admin后台中的字段实例,包括了Django自定义用户表+自定义admin后台中的字段实例的使用技巧和注意事项,需要的朋友参考一下 1.自定义用户表 注意事项 必须在settings中配置AUTH_USER_MODEL这个字段 2.在models文件中编写UserModel类 添加完成后,在当前app的admin文件中注册 3.测试 编写完上述步骤后

  • 我在修改我安装的WordPress流行帖子插件时遇到了一些问题。 它可以选择从自定义字段获取缩略图,我已将其输入为“image_facebook”。但是缩略图没有显示。 在检查代码时,我发现imgsrc有post id而不是返回图像URL。 我已经把问题缩小到我安装的另一个插件http://wordpress.org/plugins/advanced-custom-fields/ 当它处于活动状态

  • 用户输入一个值,例如、、等 Java当然用反斜杠对上述字符进行转义。因此,应用程序在缓冲区中有以下字符串 、、 现在如何将这些字符串转换回、、 我可以写一个< code>switch语句。但是有无限多的选择 如果用户输入一些unicode字符怎么办? 这不起作用 如何解释用户输入的转义字符?