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

审核实体JPA中的更改

长孙承嗣
2023-03-14
问题内容

我有Spring MVC + JPA应用程序。

我的应用程序中有几个实体在不断变化。我希望能够审核此更改。我发现有一个@Audited注释可以跟踪对某些字段或整个实体的更改。我想知道是否有任何方法可以配置此跟踪选项-
我希望能够跟踪更改的内容以及更改的人。还可以对SQL 1个表中的多个实体进行更改吗?还可以跟踪- @OneToMany实体字段的变化吗?

谢谢


问题答案:

是的,您可以跟踪所做的更改,更新的用户和时间戳。

Hibernate提供@Audited注释以维护实体版本。

Spring提供@CreatedBy @LastModifiedBy @CreatedDate
@LastModifiedDate注释,其中您需要提供使用AuditorAwarebean 更新的用户名。

要启用审核,

  1. 应该添加@EnableJpaAuditing配置类
  2. @Audited@EntityListeners(AuditingEntityListener.class)实体
  3. AuditorAware<T> 提供用户名
  4. 子实体应使用 @Audited

@Bean
public AuditorAware<String> createAuditorProvider() {
    return () -> "username"; // should be from context/session
}

对于每个实体,将创建一个附加表来维护版本

  1. {ENTITY_NAME}_AUD //可以覆盖审核表名称的前缀和后缀
  2. REVINFO

以下是使用休眠和春季审核的一对多关系示例

UserInfo.java

@Audited
@Entity
@EntityListeners(AuditingEntityListener.class)
public class UserInfo extends AuditInfo {

    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String name;

    @OneToMany(mappedBy = "userInfo", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<UserAddress> addresses;

}

UserAddress.java

@Entity
@Audited
@EntityListeners(AuditingEntityListener.class)
public class UserAddress extends AuditInfo {

    @Id
    @GeneratedValue
    private Long addressId;

    @ManyToOne
    @JoinColumn(name = "id", nullable = false)
    private UserInfo userInfo;

    @Column
    private Long no;

    @Column
    private String street;

}

AuditInfo.java

@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public abstract class AuditInfo {

    @CreatedBy
    private String createdBy;

    @LastModifiedBy
    private String updatedBy;

    @CreatedDate
    private LocalDateTime createdOn;

    @LastModifiedDate
    private LocalDateTime updatedOn;

}


 类似资料:
  • 我在试图让被审计的实体引用未被审计的实体时遇到问题。在我们的应用程序中,某些实体在没有使用hibernate的情况下被引导,这些实体是我们的元模型,不需要被审计。 如果我执行代码: 一切都很顺利,但是如果我试图获得B的版本,就会出现错误: 组织.Hibernate.对象不发现例外:不存在具有给定标识符的行 [元foo] Envers通过对metafoo实体的惰性引用成功地查找了B实体。然而,当尝试

  • 我正在使用spring数据的审计能力,并且有一个类似于这样的类: 现在,我相信我已经很好地配置了审计,因为我可以看到在更新域对象时,createdBy、createdDate、lastModifiedBy和lastModifiedDate都得到了正确的值。 但是,我的问题是,当我更新一个对象时,我会丢失createdBy和createddate的值。所以,当我第一次创建对象时,我有所有四个值,但是

  • 我正在尝试在Spring Boot应用程序中使用Spring数据、Hibernate Envers和审计。我已配置AuditorAwareImpl 和配置类。 现在我想为集成测试创建AuditorAware。我已经用test auditor创建了新的配置类 但是在添加之后,它的工作方式是I excepted-返回。所以最后我的测试类看起来是: 现在我真的很困惑bean是如何在特定的概要文件中使用的

  • 我已经使用Spring Data JPA AuditingEntityListener和AuditorAware bean设置了JPA审计。我想要的是即使在具有预定义标识符的实体上也能够持久化审计师详细信息。问题是,当具有预定义id的JPA实体被持久化和刷新时,它的审计师详细信息无法持久化: 对象引用未保存的临时实例-在刷新之前保存临时实例:me。审计道。审计详情 有趣的是,当保存具有生成id的实

  • 问题内容: 我正在使用NHibernate,并且正在寻找一种解决方案,该解决方案将允许我审核实体中所有字段的更改。我希望能够为每个实体(例如,用户-> UsersHistory)创建一个历史表,该表将具有与用户表相同的结构,并具有其他字段,例如操作类型(更新,删除),进行更改的用户的userid等。不想为每个实体定义此类。我正在寻找类似的东西(即),因为这些条目不属于我的域,仅用于准备对该实体所做

  • 我有一个实体像下面在Nestjs应用程序与typeorm为mongoDB: 我的其他实体扩展了审计,在我的应用程序中,我使用jwt来验证用户。 问题是,当我想保存一个实体,我不知道如何设置createdBy与@Before插入钩子... 我知道请求中有用户,但我不知道将用户引入方法的正确方法是什么?