当前位置: 首页 > 面试题库 >

扩展Hibernate Envers的实现

孟鹏海
2023-03-14
问题内容

我有2个Maven项目在他们各自的POM中共享一个JPA项目作为依赖项。JPA项目在2.1版上,并且成功实现了hibernateenvers。但是,我现在需要创建一个自定义的RevisionEntity,因为我需要审核其他属性,例如登录的用户ID。问题是:

一世。我不能在JPA项目中直接实现

ii。父maven项目的检索登录用户的实现不同。

真正的挑战实际上是实现RevisionListener。我尝试在JPA项目本身中创建一个抽象类的修订侦听器,可以在每个父Maven项目中扩展和实现它。大声笑!这没用!

无论如何,我将不胜感激。有出路吗?


问题答案:

我不能在JPA项目中直接实现

如果 信息
不管使用JPA的应用程序这两个应用程序的要收集有关每个版本是相同的,那么就应该在落实共同JPA项目的修订实体和监听功能没有问题。您无法执行此操作的唯一原因是,如果
信息 (即 表结构) 不同。

为此,我们需要一个抽象层。而不是RevisionListener像尝试那样扩展,您将拥有另一个接口,该接口代表侦听器将需要的 服务
,然后在子项目中实现该服务。

/**
 * Interface that implementations should extend to provider revision
 * information to the Envers revision listener.
 */
public interface RevisionInfoProvider {
  String getUserName();
}

/**
 * A class that holds a RevisionInfoProvider as a ThreadLocal.
 */
public class RevisionInfoProviderHolder {
   public static RevisionInfoProvider getProvider() {
     // impl details here to get a RevisionInfoProvider.
   }
}

然后,您的修订版侦听器实现可能类似于以下内容:

public class RevisionListenerImpl implements RevisionListener {
  @Override
  public void newRevision(Object revisionEntity) {
    if ( CustomRevisionEntity.class.isInstance( revisionEntity ) ) {
      CustomRevisionEntity entity = (CustomRevisionEntity) revisionEntity;
      // get provider from thread local and set user details
      RevisionInfoProvider provider = RevisionInfoProviderHolder.getProvider();
      entity.setUserName( provider.getUserName() );          
    }
    // todo: may want to assert in case you change entity types?
  }
}

此时,只需CustomRevisionEntity正确创建您的,并对其进行批注,包括将其指向RevisionListenerImplEnvers应该使用的侦听器实现所指向的类。

现在,在每个子项目中,您需要做的就是:

  1. 实施RevisionInfoProvider
  2. 填充RevisionInfoProviderHolder

第一个只是JPA项目如何从每个子项目获取详细信息的网关。例如,在spring Web应用程序中,这可能只是一些spring服务bean。

第二个只是每个线程在调用任何JPA东西之前需要做的事情。同样在Spring
Web应用程序中,这可能是某种类型的Web过滤器,该过滤器在调用用户代码以确保正确设置ThreadLocal之前在过滤器链的顶部执行。

父maven项目的检索登录用户的实现不同。

回到上面,正如您在上面看到的那样,带有RevisionInfoProvider句柄的抽象层可以很好地处理此问题。您为Envers建立了一个通用框架,以使其发挥作用,同时又使其具有足够的灵活性,以便每个父项目可以根据需要进行区分。

如果每个父项目存储不同的结构化信息怎么办?

如果您确实遇到这种情况,则需要在每个父项目中分别实现修订实体和侦听器, 或者 遵循我上面提到的内容,但使用满足 两个 父模块要求的修订实体。

您只需要确保在检查实体的引导阶段期间可以通过JPA模块选择修订实体。

希望这可以帮助。



 类似资料:
  • SPI 扩展接口仅用于系统集成,或 Contributor 扩展功能插件。

  • 本文向大家介绍PyTorch中的C++扩展实现,包括了PyTorch中的C++扩展实现的使用技巧和注意事项,需要的朋友参考一下 今天要聊聊用 PyTorch 进行 C++ 扩展。 在正式开始前,我们需要了解 PyTorch 如何自定义module。这其中,最常见的就是在 python 中继承torch.nn.Module,用 PyTorch 中已有的 operator 来组装成自己的模块。这种方式

  • 但是现在,我希望这些接口实现也可用于扩展,例如。 我如何设置我的课程来实现这一点?(或者,反对这样做的固有缺陷或代码气味是什么?)

  • 本文向大家介绍Android实现扩展Menu的方法,包括了Android实现扩展Menu的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android实现扩展Menu的方法。分享给大家供大家参考。具体如下: 1. java代码: 2. java代码: 3. 运行结果: 希望本文所述对大家的Android程序设计有所帮助。

  • 问题内容: 我不明白为什么要编译。我以为它检查了但没有检查? 问题答案: 泛型中的关键字在语义上与常规关键字略有不同。 当使用在泛型的上下文中,例如,这意味着,应该是一个类型的 任一 实现的接口(在情况下,当是接口), 或者 是子类(如果是一个类)。 可能的原因是,如果Generics中支持该关键字,则会使类型参数声明过于冗长。 例如,您将拥有: 相反,此方法的有效语法为: 实际上,您不需要关键字

  • 我正试图用三个额外的日期(时间戳)字段扩展扩展扩展名(新闻),并希望在(新闻)的fluidtemplate中调用这些字段。 我已经连线到目前为止,我可以看到我的后端额外的字段,而无需选择一个外部类型-我已经相应地修改了ext_tables.php,并可以保存数据。 现在,我试图在我的新闻流模板中使用这些字段,在我的Partials/List/Item中使用以下代码。html-{newsItem.d