使用hibernate envers的通用java服务来审计用户在Web应用程序中的数据库中所做的更改

时间:2014-11-04 07:33:19

标签: spring hibernate aop cdc

public class App 
{
    public static void main( String[] args )
    {

            //test insert
            tx = session.beginTransaction();
        System.out.println("Maven + Hibernate + MySQL");
       // Session session = HibernateUtil.getSessionFactory().openSession();

        //session.beginTransaction();
        Stock stock = new Stock();

        stock.setStockCode("7000");
        stock.setStockName("z");

        session.saveOrUpdate(stock);

}

Stock.java

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;

import com.warp.intercept.*;

/**
* Stock generated by hbm2java
*/

@Entity
@Table(name = "stock", catalog = "mkyong", uniqueConstraints = {
        @UniqueConstraint(columnNames = "STOCK_NAME"),
        @UniqueConstraint(columnNames = "STOCK_CODE") })
public class Stock implements java.io.Serializable, IAuditLog {

    private Integer stockId;
    private String stockCode;
    private String stockName;

    public Stock() {
    }

    public Stock(String stockCode, String stockName) {
        this.stockCode = stockCode;
        this.stockName = stockName;
    }


    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "STOCK_ID", unique = true, nullable = false)
    public Integer getStockId() {
        return this.stockId;
    }

    public void setStockId(Integer stockId) {
        this.stockId = stockId;
    }

    @Column(name = "STOCK_CODE", unique = true, nullable = false, length = 10)
    public String getStockCode() {
        return this.stockCode;
    }

    public void setStockCode(String stockCode) {
        this.stockCode = stockCode;
    }

    @Column(name = "STOCK_NAME", unique = true, nullable = false, length = 20)
    public String getStockName() {
        return this.stockName;
    }

    public void setStockName(String stockName) {
        this.stockName = stockName;
    }

我有一个java Web应用程序,我想在数据库中为所有数据库更改创建审计日志,例如(列已更改,列中的值更改,用户ID,时间戳和其他一些字段)。我想创建一个通用服务,它具有为这些操作公开的方法,我可以从应用程序中的任何其他组件访问它们。据我所知,这可以通过hibernate envers或Spring AOP来完成。能否请您建议并向我提供一个例子,我可以利用它来进一步扩展它。

P.S。 :我不想使用基于触发器的日志记录来审核数据库更改

假设这是我的实体股票;我正在通过hibernate执行一些简单的保存操作。假设,我有一个主要方法,我执行下面提到的操作

1 个答案:

答案 0 :(得分:0)

好吧,我不是Spring或Hibernate用户,所以我不知道你需要捕获什么。但如果它只是任何@Entity - 注释类的设置者,整个事情基本上会是这样的:

驱动程序应用程序:

package de.scrum_master.app;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class Application {
    public static void main(String[] args) {
        System.out.println("Maven + Hibernate + MySQL");
//      Session session = HibernateUtil.getSessionFactory().openSession();
//      Transaction tx = session.beginTransaction();
        Stock stock = new Stock();
        stock.setStockCode("7000");
        stock.setStockName("z");
//      session.saveOrUpdate(stock);
    }
}

审核方面:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class DBAuditAspect {
    @Before("execution(public void set*(*)) && @target(javax.persistence.Entity) && args(setterArgument)")
    public void entitySetterExecution(Object setterArgument, JoinPoint thisJoinPoint) {
        System.out.println(thisJoinPoint + " - " + setterArgument);
    }
}

控制台输出:

Maven + Hibernate + MySQL
execution(void de.scrum_master.app.Stock.setStockCode(String)) - 7000
execution(void de.scrum_master.app.Stock.setStockName(String)) - z

文档第9. Aspect Oriented Programming with Spring章解释了如何设置和使用Spring AOP的一般性问题。