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

为什么Hibernate Envers忽略了我的自定义修订实体?

李浩邈
2023-03-14

我正在使用JPA2.1(由Hibernate4.2.11支持)和Spring4.0.2开发一个应用程序。我们正在使用Envers审核项目实体中的更改。这很好。当我们尝试使用自定义修订实体时,问题就出现了,正如Envers文档所述:http://docs.jboss.org/hibernate/core/4.1/devguide/en-US/html/ch15.html#envers-修正日志

正如文档中所指出的,我们创建了一个自定义类和一个自定义侦听器,但是Hibernate似乎完全忽略了它们。自定义类:

@Entity
@RevisionEntity(AuditingRevisionListener.class)
public class AuditedRevisionEntity extends DefaultRevisionEntity {
  private String username;

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }    
}


public class AuditingRevisionListener implements RevisionListener {
  private static Log log = LogFactory.getLog(AuditingRevisionListener.class.getName());

  @Override
  public void newRevision(Object revisionEntity) {
    AuditedRevisionEntity revEntity = (AuditedRevisionEntity) revisionEntity;
    String userName = SecurityContextHolder.getContext().getAuthentication().getName();
    revEntity.setUsername(userName);
  }

}

这就像hibernate没有考虑到这些类,因为使用注释@RevisionEntity(AuditingRevisionListener.class)应该足够了。其他带注释的实体可以很好地识别,但这只是被忽略了。在spring配置中(我们不使用persistence.xml)有加载spring上下文时要扫描的基本包:

  <context:component-scan base-package="our.basepackage" />

这够了吗?

我们还尝试了另一种方法。在EntityManagerFactory配置中手动设置具有此属性的修订侦听器

    <prop key="org.hibernate.envers.revision_listener">our.basepackage.AuditingRevisionListener</prop>

但是,我们在newRvision方法的第一行中得到了一个类cast异常,因为参数的修订实体不属于Audited修订实体类。同样,类AuditedRevsionEntity没有加载。

我想这是一个简单的问题,但我无法猜测为什么@RevsionEntity注释被忽略了。任何想法?

共有3个答案

龙俊美
2023-03-14

即使在以上步骤之后,我仍然遇到了问题。我已将AuditedRevisionEntity添加到persistance中。xml文件来解决该问题。

我们的基本包。其他包。AuditedRevisionEntity

卫诚
2023-03-14

对于任何与SpringBoot合作的人来说,你可以改变这一点

@EntityScan(basePackages = {"yourpackage.entities","yourpackage.envers.entity"})
阳博赡
2023-03-14

我终于找到了问题所在。我的猜测是对的,hibernate忽略了我的Envers类,因为EntityManagerFactory配置中有一个参数:

<property name="packagesToScan" value="our.basepackage.otherpackage" />

我们需要告诉hibernate检查“我们的”。基本包'。愚蠢的问题容易解决。

 类似资料:
  • 问题内容: 这是从CruiseControl执行时得到的: 同时,从命令行启动它可以提供正确的结果。为什么要进入这个?为什么忽略了我?我该如何解决? 我不知道从CC启动when 的值是什么。我真的很想获得这些信息,但我不知道如何。CC本身是从用户开始与该用户给我(这是CentOS的5.4): 问题答案: 假设您有一台linux机器。 看一下,这是一个符号链接。查看此符号链接的目标位置(在我的情况下

  • 根据我所读到的内容,这是我执行依赖顺序所需要的全部内容。 然后我构建了所有的东西,设置了我的断点,并启动了应用程序。我希望在任何依赖bean之前到达“configData”bean中的断点。事情不是这样的。第一个断点在一个依赖bean的“init”方法中。 然后我更改了“log4j.xml”,将“debug”设置为“org.springframework”的日志级别,并重新运行测试。断点行为是相同

  • 我在JMeter中创建了一个脚本,它从CSV获取登录凭据。 用户名:pshah 密码:欢迎 当我执行脚本时,我可以在POST中看到值: 用户名:pshah 但密码:欢迎 我想知道原因”

  • 我正在使用Spring Boot 2.0.1和WebFlux路由器函数(不是基于注释的!)编写一个应用程序。对于我的一些数据对象,我编写了扩展的自定义序列化程序。这些我在中注册并将该模块公开为bean。 当我运行应用程序时,这个设置就像一个魅力。bean被实例化,REST响应使用正确的序列化器被序列化。 现在我想编写一个测试来验证路由器功能及其背后的处理程序是否按预期工作。我想模拟处理程序背后的服

  • 见下图。我的.gitignore文件应该忽略src/dist中的所有文件,但事实并非如此。

  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束