标签: hibernate-envers

如何使用org.hibernate.tool.EnversSchemaGenerator生成Envers数据库模式?

我将Hibernate更新为4.1.1.Final版本.根据文档 有两种方法可以生成数据库模式:

  1. Ant任务org.hibernate.tool.ant.EnversHibernateToolTask.
  2. org.hibernate.tool.EnversSchemaGenerator从Java 运行.

Hibernate-tools不适用于Hibernate-4.1.1.Final.它有一个阻止bug.

我发现只有发行说明测试用例.那么我如何使用org.hibernate.tool.EnversSchemaGenerator我的persistence.xml和Maven?

更新:

在Hibernate论坛上找到相关的主题.似乎我的问题还没有答案.

hibernate hibernate-envers

4
推荐指数
1
解决办法
8335
查看次数

如何将其他数据传递给Hibernate Envers中的Custom RevisionEntity?

这是RESTful网络应用程序.我正在使用Hibernate Envers来存储历史数据.除了修订号和时间戳,我还需要存储其他详细信息(例如:IP地址和经过身份验证的用户).Envers提供了多种方法来拥有一个非常棒的自定义修订实体.我在修改实体上设置自定义数据时遇到问题.

@RevisionEntity( MyCustomRevisionListener.class )
public class MyCustomRevisionEntity extends DefaultRevisionEntity {
    private String userName;

    private String ip;

    //Accessors
}

public class MyCustomRevisionListener implements RevisionListener {
    public void newRevision( Object revisionEntity ) {
        MyCustomRevisionEntity customRevisionEntity = ( MyCustomRevisionEntity ) revisionEntity;
        //Here I need userName and Ip address passed as arguments somehow, so that I can set them on the revision entity. 
    }
}
Run Code Online (Sandbox Code Playgroud)

由于newRevision()方法不允许任何其他参数,我无法将自定义数据(如用户名和ip)传递给它.我怎样才能做到这一点?

Envers还提供了另一种方法:

另一种使用org.hibernate.envers.RevisionListener的方法是调用org.hibernate.envers.AuditReader接口的getCurrentRevision(类revisionEntityClass,boolean persist)方法来获取当前版本,并用所需信息填充它.

所以使用上面的方法,我将不得不做这样的事情:

更改我当前的dao方法,如:

public void persist(SomeEntity entity) {
     ...
     entityManager.persist(entity);
     ...
}
Run Code Online (Sandbox Code Playgroud)

至 …

java audit spring hibernate hibernate-envers

4
推荐指数
1
解决办法
1869
查看次数

如何审核休眠中超类的一部分?

我想问一下如何使用诸如@AuditOverride,@Audited或 else 之类的休眠注释来审计实体超类的一部分。现在,我使用的是 hibernate 5.2.12 版本。
我只能在子类中使用的注释,因为超类在其他模块中,它不应该知道关于子模块的任何信息。
超类包含一个List<Items>,我不希望它被审计。因为当我使用one-to-many关系时,我不希望休眠会创建审计关系表,例如entity1_aud_entity2_aud。我只需要entity1_audentity2_aud表。
拒绝审计关系表我找到了两种方法,但都不完全正确:

第一。道路

我将列表变量和 setter/getter 复制到实体(subclass)。上面的列表变量我写了@NotAudited注释。为了使该注释起作用,我access="field"hbm文件中设置了属性。因此休眠不使用 setter 和 getter 访问变量,因此在数据拉取期间未设置超类的值
我还创建了我写的列表实体@AuditOverrides(value={@AuditOverride(forClass=Entity2.class), @AuditOverride(forClass=Item.class)})。这些注释为列表实体创建审计表。所以这种审计方式的完整代码是:
Entity1.class (main sublcass) [hibernate module]

@AuditOverrides(value = {
        @AuditOverride(forClass = Entity1.class),
        @AuditOverride(forClass = Superclass.class, name = "list", isAudited = false)
})
public class Entity1 extends Superclass {

    @NotAudited
    private List<Item> list = new ArrayList<>();

    @Override …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa hibernate-annotations hibernate-envers

4
推荐指数
1
解决办法
3006
查看次数

如何将 spring bean 注入到 hibernate envers RevisionListener 中

我正在使用 Spring 5.1 和 Hibernate 5.3.9,包括 hibernate-envers。我不知道如何将 spring bean 注入到 hibernate envers 自定义 RevisionListener 中。

我努力了

  (@Service or @Component)
  public class ExtendedRevisionListener implements RevisionListener {

  @Autowired
  private MyService myService;

  void newRevision(Object revisionEntity){
    myService.doSomething(...)
  }
}
Run Code Online (Sandbox Code Playgroud)

当然,该类包含在 @ComponentScan 包解析中。问题是 myService 没有注入到侦听器中。

在 hibernate-envers 文档中:

https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#envers-basics

从 Hibernate Envers 5.3 开始,RevisionListener 现在支持依赖注入。此功能取决于各种依赖框架(例如 CDI 和 Spring),以在 Hibernate ORM 引导期间提供必要的实现以支持注入。如果未提供合格的实现,则将在不注入的情况下构造 RevisionListener。

不幸的是我还没有找到任何有效的例子。

@Naros我在我的Spring持久性JPA配置中设置了EntityMaganerFactoryBean - >entityManager = new org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean()

10:49| DEBUG | SessionFactoryImpl.java 252 | Session factory constructed with filter configurations : {}
10:49| DEBUG …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-envers spring-data-jpa

4
推荐指数
1
解决办法
5585
查看次数

Hibernate Envers:审核阅读器在尝试获取修订历史记录时抛出 LazyInitializationException

我成功配置了我想要审核的 Hibernate Envers 实体,但是当我尝试使用审核阅读器获取审核历史记录时,我得到了java.lang.NoSuchMethodError. 代码片段如下所示。

域模型Part.java

@Entity
@Data
@NoArgsConstructor
@Audited
@Table(name="part")
@JsonIgnoreProperties({"hibernateLazyInitializer"})
public class Part implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    private Integer weight;

    public Part(String name, Integer weight){
        this.name = name; this.weight = weight;
    }
}

Run Code Online (Sandbox Code Playgroud)

控制器:

@RestController
@RequestMapping("/api/part")
@RequiredArgsConstructor
@Transactional
public class PartController {

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private final EntityManager entityManager;

    private final PartRepository partRepository;

    @GetMapping("/get-all")
    public List<Part> getAll() {
        return partRepository.findAll();
    }

    @PostMapping("/insert")
    public Part insert(@RequestBody …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-entitymanager hibernate-envers spring-boot

4
推荐指数
1
解决办法
1406
查看次数

Hibernate Envers:查询修订的问题

我使用Hibernate Envers进行审计.我的实体看起来像这样:

@Entity
@Audited
public class Child
{
    @GeneratedValue
    @Id
    @Column
    private Long id;

    @Column
    private String test;

    // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

现在我想查询这样的修订:

query = reader.createQuery().forRevisionsOfEntity(Child.class, false, true);
query.add(AuditEntity.property("test").eq("child1"));

Long id = ...;
query = reader.createQuery().forRevisionsOfEntity(Child.class, false, true);
query.add(AuditEntity.property("id").eq(id));
Run Code Online (Sandbox Code Playgroud)

第一个查询有效,执行第二个查询会抛出以下异常:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map
    at org.hibernate.property.MapAccessor$MapGetter.get(MapAccessor.java:118)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:77)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:83)
    at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:381)
    at org.hibernate.type.ComponentType.nullSafeGetValues(ComponentType.java:354)
    at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:309)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:567)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1612)
    at org.hibernate.loader.Loader.doQuery(Loader.java:717)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2294)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
    at org.hibernate.loader.Loader.list(Loader.java:2167)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) …
Run Code Online (Sandbox Code Playgroud)

hibernate hibernate-envers

3
推荐指数
2
解决办法
4101
查看次数

使用Hibernate envers查找最近删除的实体

所以我的问题是我需要找到特定类的所有最近删除的实体,即自特定时间戳以来已删除的实体.具体来说,我想找到在过去一小时内删除的实体.

我的所有实体都有一个创建和更新的时间戳,我通过监听器正确维护:

@NotNull
@Column(name = "updated")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime updated;
Run Code Online (Sandbox Code Playgroud)

我还使用Envers并注释我的实体.

所以要猜测,我的查询应该像这样开始:

// Query for deleted bookings
AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Booking.class, false, true)
Run Code Online (Sandbox Code Playgroud)

但我不知道在这里找到自DateTime以来删除的预订.

java hibernate hibernate-envers

3
推荐指数
1
解决办法
5617
查看次数

休眠envers:RelationTargetAuditMode.NOT_AUDITED与@NotAudited

我尝试审核一个实体,但是我不想审核其关系。如果我将@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)放在@ManyToOne关系中,则此方法有效,我也没有任何例外,但是当我尝试在@onetomany中使用定义了mapbyby参数的相同注释时,我有一个我必须审核另一个实体的例外情况。

例:

@Table(name = "OWNERS")
@Entity
@EntityListeners(AuditingEntityListener.class)
@Audited
public class Owner {
...
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  @ManyToOne(fetch=FetchType.LAZY)
  private User user;
...
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner" )
  private Set<Pet> pets = new HashSet<Pet>();
...
}
Run Code Online (Sandbox Code Playgroud)

java audit hibernate hibernate-envers

3
推荐指数
1
解决办法
3508
查看次数

spring-data-envers Hibernate java.lang.NoSuchMethodError:org.hibernate.engine.spi.SessionImplementor.getTransactionCoordinator

我有一个带有Hibernate 5.2.2和Spring Data Envers 1.0.5的Spring Boot 1.4.2应用程序。实体在未经审核时会保持良好状态。使用以下注释对实体进行注释会@Audited导致使用以下堆栈跟踪进行事务回滚。有任何想法吗?

> 2016-12-22 18:15:08,364 ERROR | http-nio-8080-exec-1 |
> org.springframework.orm.jpa.JpaTransactionManager       | Commit
> exception overridden by rollback exception 
> java.lang.NoSuchMethodError:
> org.hibernate.engine.spi.SessionImplementor.getTransactionCoordinator()Lorg/hibernate/resource/transaction/TransactionCoordinator;
> at
> org.hibernate.envers.internal.synchronization.AuditProcess.doBeforeTransactionCompletion(AuditProcess.java:131)
> at
> org.hibernate.envers.internal.synchronization.AuditProcessManager$1.doBeforeTransactionCompletion(AuditProcessManager.java:46)
> at
> org.hibernate.engine.spi.ActionQueue$BeforeTransactionCompletionProcessQueue.beforeTransactionCompletion(ActionQueue.java:928)
> at
> org.hibernate.engine.spi.ActionQueue.beforeTransactionCompletion(ActionQueue.java:503)
> at
> org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2383)
> at
> org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:467)
> at
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:146)
> at
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
> at
> org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:220)
> at
> org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:68)
> at
> org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
> at
> org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)
> at …
Run Code Online (Sandbox Code Playgroud)

hibernate-envers spring-data spring-data-jpa spring-boot

3
推荐指数
1
解决办法
1946
查看次数

Spring Data Envers org.springframework.data.mapping.PropertyReferenceException:找不到类型的属性findRevisions

我有一个带有Hibernate 5.2.6和Spring数据Envers 1.0.5的Spring boot 1.4.2应用程序.我正在审核我的实体,并且审核记录保持正确.

我的应用程序配置类被注释为使用EnversRevisionRepositoryFactoryBean.class作为JPA存储库工厂.

应用程序配置

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
@EnableTransactionManagement
public class ApplicationConfig {}
Run Code Online (Sandbox Code Playgroud)

我试图阅读被审计实体的修订版.实体存储库扩展了RevisionRepository.

实体模型

@Entity(name = "Base")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.INTEGER)
@Table(name = "BASE")
@Audited
public abstract class Base {

  @Id
  @GeneratedValue(generator = "baseSeq", strategy = GenerationType.SEQUENCE)
  @SequenceGenerator(name = "baseSeq", sequenceName = "BASE_SEQ", allocationSize = 1)
  @Column(name = "id", updatable = false, nullable = false)
  private Long id;

  @Column(name = "name", nullable = false)
  private String name;

  @Column(name = …
Run Code Online (Sandbox Code Playgroud)

spring hibernate-envers spring-data spring-data-jpa spring-boot

3
推荐指数
1
解决办法
3801
查看次数