栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

扩展Hibernate Envers的实现

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

扩展Hibernate Envers的实现

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

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

为此,我们需要一个抽象层。而不是

RevisionListener
像尝试那样扩展,您将拥有另一个接口,该接口代表侦听器将需要的 服务
,然后在子项目中实现该服务。

public interface RevisionInfoProvider {  String getUserName();}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
正确创建您的,并对其进行批注,包括将其指向
RevisionListenerImpl
Envers应该使用的侦听器实现所指向的类。

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

  1. 实施RevisionInfoProvider
  2. 填充RevisionInfoProviderHolder

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

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

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

回到上面,正如您在上面看到的那样,带有

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

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

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

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

希望这可以帮助。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447580.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号