【问题标题】:Audit Trail Design in Hibernate using Interceptors使用拦截器在 Hibernate 中进行审计跟踪设计
【发布时间】:2017-02-07 17:19:36
【问题描述】:

我是 Hibernate 的新手,希望在大多数表(但不是全部)中维护审计信息。这是完成的工作。

Employee.java

@Entity
@Table(name = "EMPLOYEE")
public class Employee {

@Id
@GeneratedValue
@Column(name = "ID")
private long id;
@Column(name = "FIRSTNAME")
private String firstName;
@Column(name = "LASTNAME")
private String lastName;
@Column(name = "EMAIL")
private String email;
@Column(name = "PHONE")
private String phone;
@Embedded
AuditInformation auditInformation;

AuditInformation.java

@Embeddable
public class AuditInformation implements Auditable {

    @Column(name = "Created_Date")
    private Date createdDt;
    @Column(name = "Created_By")
    private String createdBy;
    @Column(name = "Last_modified_by")
    private String lastModifiedBy;
    @Column(name = "last_modified_Date")
    private Date lastModifiedDt;

Auditable.java

public interface Auditable {
    public void setCreatedDt(Date createdDt);    
    public Date getCreatedDt();    
    public void setLastModifiedDt(Date createdDt);
    public Date getLastModifiedDt();
}

AuditInfoInterceptor.java

public class AuditInfoInterceptor extends EmptyInterceptor {

    @Override
    public boolean onFlushDirty(final Object entity, final Serializable id,
            final Object[] currentState, final Object[] previousState,
            final String[] propertyNames, final Type[] types) {

        if (entity instanceof Auditable) {
            for (int i = 0; i < propertyNames.length; i++) {
                if (propertyNames[i] == "createdDt") {
                    currentState[i] = new java.util.Date();
                    return true;
                }
                if (propertyNames[i] == "lastModifiedDt") {
                    currentState[i] = new java.util.Date();
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public boolean onSave(final Object entity, final Serializable id,
            final Object[] state, final String[] propertyNames,
            final Type[] types) {
        if (entity instanceof Auditable) {
            for (int i = 0; i < propertyNames.length; i++) {
                if (propertyNames[i] == "createdDt") {
                    state[i] = new java.util.Date();
                    return true;
                }
                if (propertyNames[i] == "lastModifiedDt") {
                    state[i] = new java.util.Date();
                    return true;
                }
            }
        }
        return false;    
    }
}

spring-context.xml

<bean id="hibernate4AnnotationSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>Employee</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>

        <property name="entityInterceptor" ref="auditInterceptor" />

现在我想将审计信息存储到数据库中,在使用save() 方法填充对象后可以存储该数据库。但是我的拦截器没有进行任何更新,因为它通过instanceof 检查失败并且什么也不做。现在我的问题是

  • 为什么lastModifiedDt 属性/对象对我的拦截器可用,因为它只查找实体(在我的情况下是Employee)?

请建议它是否是正确的设计。因为我正处于学习阶段。因此,试图以这种方式进行。我会在这之后寻找Hibernate Envers

提前致谢

【问题讨论】:

    标签: hibernate interceptor audit-logging


    【解决方案1】:

    lastModifiedDt 存在是因为您将AuditInformation 嵌入为Employee 的属性。然后它成为实体的statepropertyNames 的一部分。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 1970-01-01
      • 2018-07-25
      • 2011-11-26
      • 1970-01-01
      • 2018-04-18
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多