我目前正在使用Hibernate Envers.
如何删除与我要删除的实体相关的审计表中的条目?我的实体与其他实体没有关系.
我发现我必须在onPostDelete自定义侦听器的方法中执行此操作:
import org.hibernate.envers.event.AuditEventListener;
import org.hibernate.event.PostCollectionRecreateEvent;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostInsertEvent;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PreCollectionRemoveEvent;
import org.hibernate.event.PreCollectionUpdateEvent;
public class MyListener extends AuditEventListener {
...
@Override
public void onPostDelete(PostDeleteEvent arg0) {
// TODO Auto-generated method stub
super.onPostDelete(arg0);
}
...
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了文档,论坛,很多东西,但我无法弄清楚.也许这是不可能的,我不知道.
有人曾经这样做过吗?
我在生产中有一个基于Hibernate的应用程序,有一个大型数据库.我需要在这个应用程序中向两个实体(两个表)添加审计,我决定使用Envers.
对于每个INSERT,UPDATE或DELETE,Envers都会向实体的审计表添加新记录.
如果我从应用程序的启动中获得了Envers支持,则会在创建实体(INSERT)时填充审计表.
Envers文档非常精简,并未提及有关向现有应用程序添加Envers的任何信息.
如果我只是添加Envers支持并创建相应的审计表,它们将从空开始,因此当我更新现有实体时,Envers会将记录添加到记录新值的审计表中,但我将丢失以前的值.
如何向具有现有数据库的应用程序添加Envers支持?
我最近发现了一个名为"hibernate envers"的漂亮的库,它是一个非常简单的方法来获得审计日志,它解决了我在玩网络应用程序时遇到的最大问题之一.现在,我知道Envers为每个被审计的实体使用一个表,并想知道是否有可能为每个事物都有一个表?(使用varchar来放置所有数据并将实体模型放在单独的列中)
提前致谢.
我们使用Hibernate(使用JPA)和Hibernate Envers来持久化对象的历史.Web应用程序运行许多线程,其中一些是通过其他应用程序的RMI方法调用创建的,其中一些是由应用程序本身创建的,其中一些是为处理http请求而创建的(它们生成视图).
我们还使用Open Session In View模式来管理会话,因此我们的web.xml包含:
<filter>
<filter-name>openEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
使用DAO访问数据库,所有这些都有Spring注入的EntityManagers.
@PersistenceContext
protected EntityManager em;
@PersistenceUnit
protected EntityManagerFactory emf;
Run Code Online (Sandbox Code Playgroud)
在我们决定使用Hibernate Envers之前,一切都运行良好.当任何不是视图生成线程的线程运行代码以获取旧版本的对象时,抛出异常.
@Override
public O loadByRevision(Long revision, Long id) {
@SuppressWarnings("unchecked")
O object = (O) AuditReaderFactory.get(em).createQuery().forEntitiesAtRevision(getBaseClass(), revision.intValue())
.add(AuditEntity.id().eq(id)).getSingleResult();
return object;
}
Run Code Online (Sandbox Code Playgroud)
线程"Scheduler"中的异常org.hibernate.SessionException:会话已关闭!在Org.hibernate.envers.tools.quols.QueryBuilder.toQuery(QueryBuilder)的org.hibernate.internal.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:129)org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1776) .java:226)org.hibernate.envers.query.impl.AbstractAuditQuery.buildQuery(AbstractAuditQuery.java:92)org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:108)at org. hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:110)(..)
当上面的代码由视图生成线程运行时,它工作正常.此外,DAO中的非envers代码适用于每个线程.例如,下面的代码段
@Override
public O load(Long id) {
final O find = em.find(getBaseClass(), id);
return find;
}
Run Code Online (Sandbox Code Playgroud)
可以通过RMI线程运行而不会出现问题.
为什么非视图线程可以在没有异常的情况下调用实体管理器上的方法,但是不能将Envers的AuditReaderFactory与该实体管理器一起使用?我认为可能在实体管理器上调用方法会创建一个临时会话但是在使用Envers时不会发生,这是真的吗?
解决该问题的最佳方法是什么(以便可以从每个线程使用AuditReaderFactory)?
我正在使用带有Envers的Hibernate 4.3.4和MySql 5.6.
如果没有JPA 2.1转换器,Party下面的实体就会失败Configuration.buildSessionFactory(),因为Hibernate不知道如何处理Name类:
@Entity
@Audited
public class Party
{
protected Name name;
...
}
Run Code Online (Sandbox Code Playgroud)
例外是:
org.hibernate.MappingException:
Could not determine type for:
ModuloADM.Party.Name,
at table: Party, for columns: [org.hibernate.mapping.Column(name)]
Run Code Online (Sandbox Code Playgroud)
要解决此问题,我然后添加此转换器:
@Converter (autoApply=true)
public class NametoStringConverter
implements AttributeConverter<Name, String>
{ ... }
Run Code Online (Sandbox Code Playgroud)
现在异常变为:
org.hibernate.MappingException:
Could not determine type for:
BasicType adapter for AttributeConverter<Name,String>,
at table: History_Party, for columns: [org.hibernate.mapping.Column(name)]
Run Code Online (Sandbox Code Playgroud)
现在,在Party实体的Envers审核表中失败了.请注意,这History_Party是审计表的名称,由选择config.setProperty("org.hibernate.envers.audit_table_prefix", "History_").
完整的堆栈跟踪是:
org.hibernate.MappingException:
Could not determine type for:
BasicType adapter …Run Code Online (Sandbox Code Playgroud) 我正在使用 hibernate envers 来审计事件,当我调用 repositoy.delete() 或 repository.save() 时,它与 Spring Data JPA Repository 一起工作得很好
但是,如果我编写 jpa 查询并使用查询删除实体,则不会调用休眠环境审计侦听器。
我读到 hibernate envers 不会捕获本机查询 - 但它也不适用于 hibernate/jpa 查询吗?
感谢生命
我们的Java应用程序是基于Spring的,我们有域类和通过Liquibase生成的相应模式.
我们计划添加对要审核的单个域的支持.
一个.我们没有hibernate.xml和hibernate.cfg.xml,而是使用application-context.xml.那么如何通过@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">_AUD</prop>
<prop key="hibernate.hbm2ddl.auto">update</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)
但是此配置未在开发环境中创建审计表.我不清楚我在这里缺少什么额外的配置.
湾 如何使用Liquibase创建必要的envers特定模式,生产团队不熟悉在生产环境中自动生成SQL模式的想法.
我刚刚将项目的hibernate版本升级到5.0.0.FINAL.但我意识到这一点,我收到了这个警告.我想摆脱它.我不知道它是否会影响我的申请.
2015-08-24 14:29:22.235 WARN --- [ main] org.hibernate.orm.deprecation : HHH90000003: Use of DOM4J entity-mode is considered deprecated
Run Code Online (Sandbox Code Playgroud)
由于我从未明确使用实体模式,因此我在网上搜索但几乎没有关于它的信息.这是EntityMode枚举.因为,没有DOM4J模式,我怀疑如果我继续在5.0.0版本中使用hibernate,我可能会在生产中出错.
我也在使用hibernate的envers.如果我禁用envers,警告也会消失.我正在使用spring和hibernate以及envers.这是他们的版本.
<spring.version>4.2.0.RELEASE</spring.version>
<hibernate.version>5.0.0.Final</hibernate.version>
<hibernate.envers.version>5.0.0.Final</hibernate.envers.version>
<hibernate-jpa-2.1-api.version>1.0.0.Final</hibernate-jpa-2.1-api.version>
<project.java.version>1.8</project.java.version>
Run Code Online (Sandbox Code Playgroud)
这是我的hibernate-jpa配置.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="commonsEntityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="commonDataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.ejb.interceptor">com.examples.dao.utils.AbstractEntityInterceptor</prop>
<!--<prop key="hibernate.listeners.envers.autoRegister">false</prop>-->
<prop key="hibernate.implicit_naming_strategy">org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl</prop>
<prop key="hibernate.physical_naming_strategy">org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl</prop>
<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
<prop key="hibernate.showSql">${hibernate.showSql}</prop>
<prop key="hibernate.formatSql">${hibernate.formatSql}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
<prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop> …Run Code Online (Sandbox Code Playgroud) I'm using Hibernate Envers 4.1.0 + Spring 3.1.0 on my application running on Wildfly 9.0.2. Whenever I insert or update a entity it persists the entity just fine but Envers does not persist a new rev on my AUD tables.
I'm searching for quiet a while for a answer but still hasn't found it.
Here is what I tried so far:
context.xml. Later it came to my knowledge that starting from Envers 4 the …我正在使用hibernate-envers与spring. 一切都工作得很好,除了当我删除一个实体时,它不会更改审计表中updated_by和的值updated_date,而是将实体保存为与之前完全相同的实体(仅复制)spring.jpa.properties.org.hibernate.envers.store_data_at_delete=true。
我已经尝试注册监听器EventType.PRE_DELETE,但没有帮助。
这是我的更新实体:
@LastModifiedBy
@Column(nullable = false)
private Long updatedBy;
@LastModifiedDate
@Column(nullable = false)
private Date updatedDate;
Run Code Online (Sandbox Code Playgroud)
如何通过修改列updated_by和来捕获审计表中删除的人员和删除时间updated_date?
hibernate ×10
hibernate-envers ×10
java ×6
spring ×5
jpa ×3
audit-tables ×1
database ×1
jpa-2.1 ×1