标签: hibernate-envers

Hibernate Envers和"Javassist Enhancement failed"异常

我们正在使用Hibernate Envers并出现以下情况:

一个类BusinessObjectTypeIdentity一个引用的类BusinessObjectType:

@Entity
@Table( name = "ID_IDENTITY" )
@Audited
public class Identity {

    @ManyToOne
    @JoinColumn( name = "BO_TYPE_ID" )
    @IndexColumn( name = "INDEX_BO_BO_TYPE" )
    private BusinessObjectType businessObjectType;

    […]

}
Run Code Online (Sandbox Code Playgroud)

然后我们查询所有版本的Identity:

AuditQuery auditQuery = auditReader.createQuery().forRevisionsOfEntity(
    Identity.class,
    false,
    true );
auditQuery.add( AuditEntity.id().eq( dbid ) );

@SuppressWarnings( "unchecked" )
List< Object[]> history = (List< Object[]>) auditQuery.getResultList();
Run Code Online (Sandbox Code Playgroud)

如果存储的身份没有BusinessObjectType(即,businessObjectType是和否),一切都像魅力一样.

如果身份有一个businessObjectType != null我们得到"Javassist Enhancement failed"异常:

Javassist Enhancement failed: ch.ethz.id.wai.baseclasses.BusinessObjectType
Run Code Online (Sandbox Code Playgroud)

这个错误似乎与Envers试图实例化一个BusinessObjectType有关但我真的没看到问题是什么(如果我们不使用AuditQuery,Hibernate对这两个对象都没有问题).

异常的原因是

java.lang.InstantiationException: ch.ethz.id.wai.baseclasses.BusinessObjectType_$$_javassist_49 …
Run Code Online (Sandbox Code Playgroud)

hibernate hibernate-envers

13
推荐指数
1
解决办法
1万
查看次数

hibernate-envers将RevisionListener spring集成为spring bean

我需要在hibernate-envers的修订监听器中进行一些数据库处理.为此,我需要Spring Framework的inejction功能.如何实施?下面是代表需求的代码,但CustomRevisionListener由Envers代码中的构造函数实例化.Spring只SecurityContextHolder作为静态服务定位器.如何注入其他豆类?

@Service
public class CustomRevisionListener implements EntityTrackingRevisionListener {

      @Resource
      private PersistenceManagerHibernate persistenceManagerHibernate;

      public void newRevision(Object revisionEntity) {
                CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
    revision.setUsername(getUsername());
      }


      public String getUsername() {
    final SecurityContext context = SecurityContextHolder.getContext();
    if (context != null) {
        if (context.getAuthentication() != null) {
                  return context.getAuthentication().getName();
        } else {
                  return "anonymous";
        }
    }
    return "anonymous";
      }

      @Override
      public void entityChanged(@SuppressWarnings("rawtypes") Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) {
                CustomRevisionEntity revision = (CustomRevisionEntity) revisionEntity;
                revision.setEntityId(entityId.toString());
                revision.setEntityName(entityName); …
Run Code Online (Sandbox Code Playgroud)

spring dependency-injection hibernate-envers

12
推荐指数
1
解决办法
3112
查看次数

在Spring Hibernate java项目中使用"Envers"审计表

我们需要使用envers审核现有表.我们没有hibernate.xml而不是使用application-context.xml.我们通过"liquibase-changeset"创建模式,然后如何通过@Entity和@Audited等注释创建.

我该如何解决这个问题?

我添加了hibernate配置喜欢

<property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                <prop key="hibernate.ejb.event.post-insert">org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-update">org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-delete">org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.pre-collection-update">org.hibernate.envers.event.AuditEventListener</prop>
                <!-- <prop key="hibernate.ejb.event.pre-collection-remove">org.hibernate.envers.event.AuditEventListener</prop>
                <prop key="hibernate.ejb.event.post-collection-recreate">org.hibernate.envers.event.AuditEventListener</prop> -->
                <prop key="org.hibernate.envers.revision_field_name">REV</prop>
                <prop key="org.hibernate.envers.revision_type_field_name">REVTYPE</prop>
                <prop key="org.hibernate.envers.auditTablePrefix"></prop>
                <prop key="org.hibernate.envers.auditTableSuffix">_HISTORY</prop>
                <prop key="hibernate.hbm2ddl.auto">create</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
Run Code Online (Sandbox Code Playgroud)

在我的域类中添加了@Audited注释

@Entity
@Audited
@Table(name="user")
public class User implements Serializable {
Run Code Online (Sandbox Code Playgroud)

但是这个配置删除了我现有的表

例如

Mydatabase
-----------

user
product
order_details
user_role
login
Run Code Online (Sandbox Code Playgroud)

我的数据库中有5个表.运行我的应用程序后,它显示3个表.它不删除创建"审计"表,而是删除现有表.

 Mydatabase
  -----------

  user
  product
  order_details
Run Code Online (Sandbox Code Playgroud)

如何在不触及现有表的情况下创建审计(_HISTORY)表???

java spring hibernate jpa hibernate-envers

12
推荐指数
1
解决办法
8797
查看次数

Hibernate与其他审计表连接表

我有一个带有修订的审计表,我想创建另一个与审计表修订版具有一对多关系的表.审计修订将指向新表数据.我怎样才能做到这一点?

hibernate one-to-many hibernate-envers

12
推荐指数
1
解决办法
1398
查看次数

如何从customRevisionEntity检索用户名

我们正在使用Hibernate-envers 3.6.3.Final,我正在使用@Audited注释正确生成表.我使用CustomRevisionEntity存储用户信息,CustomRevisionListenner也存储用户信息.但是,如果我尝试检索"用户名",它将返回以下错误.

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:64) ~[spring-orm-3.2.6.RELEASE.jar:3.2.6.RELEASE]
Run Code Online (Sandbox Code Playgroud)

我的CustomRevisionEntity类,

@Entity
@Table(name = "revision_info")
@RevisionEntity(CustomEnversListener.class)
public class CustomRevisionEntity implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long timestamp;

    private String username;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-envers

11
推荐指数
1
解决办法
1342
查看次数

在Hibernate Envers中获取以前版本的实体

我有一个由Hibernate(via EntityManager)加载的实体:

User u = em.load(User.class, id)
Run Code Online (Sandbox Code Playgroud)

该课程由Hibernate Envers审核.如何加载以前版本的用户实体?

java jboss hibernate hibernate-envers

10
推荐指数
2
解决办法
1万
查看次数

目前不支持公式映射 - Hibernate ORM Envers

我使用Hibernate Envers:

@Entity 
@Table(name = "user")
@Audited
class User()
{
    private String id;
    @Formula("(SELECT name FROM other c where c.id = id)")
    private Integer name;
}
Run Code Online (Sandbox Code Playgroud)

它抛出:

[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]:调用init方法失败; 嵌套异常是org.hibernate.envers.configuration.internal.metadata.FormulaNotSupportedException:目前不支持公式映射(除了@DiscriminatorValue)

如何使用@Formula和Hibernate Envers计算实体属性?

仅供参考当我删除Hibernate Envers时,它可以正常工作.

java spring hibernate hibernate-envers

10
推荐指数
1
解决办法
1107
查看次数

使用hibernate-envers时,AUD表中的所有@Version字段都为null,但是在实体 - 表填充的okey中?

应用程序spring + jpa + envers(hibernate)envers需要在特殊表中保存实体的历史记录.

在我保存了几次实体之后,我希望在USER表中看到填充版本字段,在USER_AUT中看到填充版本字段.但实际的结果是user表中正确的值,但在版本colums添加REV_TYPE,REV列(在现场只是种台的所有行)和空.

我使用4.0.1.Final hibernate

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>4.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.0.1.Final</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

但是,当我查看表时,Version字段中的所有值都为null

我的实体是

import lombok.*;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.envers.Audited;

import javax.persistence.*;

@Entity
@Audited
@Table(name = "User", uniqueConstraints = {
        @UniqueConstraint(columnNames = { "prKey"})})
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor
@Getter
@Setter
public class User {
    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid2")
    @Column(name = "PR_KEY", unique = true)
    private String prKey;

    @Column(name = "name", length = 100, unique = false)
    private String …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate jpa hibernate-envers

10
推荐指数
1
解决办法
456
查看次数

Spring Data Rest:为扩展Revision Repository的Repository公开新的端点

我想为我的存储库公开新的端点,这也扩展了RevisionRepository.

@RepositoryRestResource(collectionResourceRel = "persons", itemResourceRel = "person", path = "persons")
public interface PersonRepository extends PagingAndSortingRepository<PersonEntity, Long>, RevisionRepository<PersonEntity, Long, Integer> {

    Revision<Integer, PersonEntity> findLastChangeRevision(@Param("id") Long id);

    Revisions<Integer, PersonEntity> findRevisions(@Param("id") Long id);

    Page<Revision<Integer, PersonEntity>> findRevisions(@Param("id") Long id, Pageable pageable);

    PersonEntity findByName(@Param("name") String name);
}
Run Code Online (Sandbox Code Playgroud)

我现在的问题是,这些新方法不会作为网址(findLastChangeRevision,findRevisions)公开,只会findByName在搜索网址下.我目前对于实际的网址形式并不是特别关注,只要它有效.

我现在知道的唯一选择是

  1. 分离修订存储库
  2. 创建一个映射到"/"的新控制器,以替换Spring Data Rest创建的控制器,并手动添加所有存储库链接.我的一个问题是我的链接将被硬编码(与链接到控制器时不同),路径将是相对的 - 不一定是坏的,但会使一切都不一致.
  3. 添加映射到修订存储库的"/"链接

我对上面的选项有很多保留意见.我不知道该怎么办.

java spring hibernate-envers spring-data spring-data-rest

9
推荐指数
1
解决办法
1296
查看次数

REVINFO 表缺少序列“revinfo_seq”

我正在迁移到 SpringBoot 3.0.1 并将“hibernate-envers”版本更新为“6.1.6.Final”。我的数据库是 PostgreSQL 13.6。Hibernate 配置为创建数据库模式: spring.jpa.hibernate.ddl-auto:create

启动应用程序后,我收到以下错误:

pim 2022-12-27 12:00:13,715 WARN  C#c7b942ec-33b4-4749-b113-22cbb2946a8d [http-nio-9637-exec-1]     SqlExceptionHelper/133              - SQL Error: 0, SQLState: 42P01
pim 2022-12-27 12:00:13,715 ERROR C#c7b942ec-33b4-4749-b113-22cbb2946a8d [http-nio-9637-exec-1]     SqlExceptionHelper/138              - ERROR: relation "revinfo_seq" does not exist
  Position: 16
Run Code Online (Sandbox Code Playgroud)

revinfo 表如下所示:

create table revinfo
(
    revision           bigint not null
        primary key,
    client_id          varchar(255),
    correlation_id     varchar(255),
    origin             varchar(255),
    request_id         varchar(255),
    revision_timestamp bigint not null,
    timestamp_utc      timestamp with time zone,
    user_name          varchar(255)
);
Run Code Online (Sandbox Code Playgroud)

序列“revinfo_seq”不存在,但在带有 envers 的旧数据库结构中

5.6.8.Final
Run Code Online (Sandbox Code Playgroud)

而 SpringBoot 2.6.6 它也不存在,没有任何问题。我缺少什么?

我尝试切换参数

org.hibernate.envers.use_revision_entity_with_native_id …
Run Code Online (Sandbox Code Playgroud)

postgresql hibernate-envers spring-boot

9
推荐指数
1
解决办法
4625
查看次数