【问题标题】:generalized java service using hibernate envers to audit changes done by user in database in web application通用 java 服务使用休眠环境来审计用户在 Web 应用程序的数据库中所做的更改
【发布时间】:2014-11-04 07:33:18
【问题描述】:
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、时间戳和其他一些字段)。我想创建一个通用服务,它具有为此类操作公开的方法,并且我可以从应用程序中的任何其他组件访问它们。据我所知,这可以通过休眠环境或 Spring AOP 来完成。您能否建议并提供一个示例,我可以利用它来进一步扩展它。

附: : 我不想使用基于触发器的日志记录来审计数据库更改

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

【问题讨论】:

  • 不清楚的问题没有任何示例代码作为讨论的基础。请更新问题并更具体。
  • 添加了代码。具体一点;我想开发一个通用的服务/组件,它可以在不同的项目中使用,以审计日志应用程序中表上发生的数据库更改。例如:我想在这些表上放置一些拦截器或类似的东西,并且每当对该表执行操作时;更改存储在表中。我已经通过 Hibernate 拦截器实现了这一点,但我想通过 Spring AOP 来实现。

标签: spring hibernate aop cdc


【解决方案1】:

好吧,我不是 Spring 或 Hibernate 用户,所以我不知道您究竟需要捕获什么。但如果它只是任何 @Entity-annotated 类的设置器,那么整个事情基本上看起来像这样:

驱动程序应用:

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

有关如何设置和使用 Spring AOP 的更一般的问题在文档9. Aspect Oriented Programming with Spring 章节中进行了解释。

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 2014-03-22
    • 2014-10-14
    • 1970-01-01
    • 2014-10-13
    • 2015-04-07
    • 2017-11-25
    • 2011-09-25
    相关资源
    最近更新 更多