我们正在使用Hibernate Envers并出现以下情况:
一个类BusinessObjectType和Identity一个引用的类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-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) 我们需要使用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)表???
我有一个带有修订的审计表,我想创建另一个与审计表修订版具有一对多关系的表.审计修订将指向新表数据.我怎样才能做到这一点?
我们正在使用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) 我有一个由Hibernate(via EntityManager)加载的实体:
User u = em.load(User.class, id)
Run Code Online (Sandbox Code Playgroud)
该课程由Hibernate 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时,它可以正常工作.
应用程序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) 我想为我的存储库公开新的端点,这也扩展了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在搜索网址下.我目前对于实际的网址形式并不是特别关注,只要它有效.
我现在知道的唯一选择是
我对上面的选项有很多保留意见.我不知道该怎么办.
我正在迁移到 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) hibernate-envers ×10
hibernate ×7
java ×6
spring ×5
jpa ×2
jboss ×1
one-to-many ×1
postgresql ×1
spring-boot ×1
spring-data ×1