6 Replies Latest reply: Sep 6, 2011 11:29 AM by koval80 RSS

Missing properties in Envers auditing tables

koval80 Newbie

I am using envers to audit my ParameterToValue entity. Its properties "containerId", "containerType", "parameterId" which do appear as columns in a mapped DB table "values_for_params" (a regular Hibernate table), are missing at the envers generated "values_for_params_AUD" DB table - meaning that they are not audited. I need the ability to get historic "value" for given (containerId, containerType, parameterId).

 

The ParameterToValue  class:

 

@Audited
public class ParameterToValue extends BasicValueHolder {
private Long containerId;
private ContainerType containerType;
private Long parameterId;

public ParameterToValue(ContainerID containerId, Long parameterId, Value value) {
   
super(value);
   
this.containerId = containerId.getContainerId();
   
this.parameterId = parameterId;
    containerType
= containerId.getContainerType();
}

ParameterToValue() {
}

public Long getParameterId() {
   
return parameterId;
}
@AuditOverride(name = "parameterId",isAudited = true)
public void setParameterId(Long parameterId) {
   
this.parameterId = parameterId;
}

public Value getValue() {
   
return value;
}

public void setValue(Value value) {
   
this.value = value;
}

public Long getContainerId() {
   
return containerId;
}
@AuditOverride(name = "containerId",isAudited = true)
public void setContainerId(Long containerId) {
   
this.containerId = containerId;
}

public ContainerType getContainerType() {
   
return containerType;
}
@AuditOverride(name = "containerType",isAudited = true)
public void setContainerType(ContainerType containerType) {
   
this.containerType = containerType;
}

}

 

The Hibernate mapping definition:

 

<class name="platform.server.dataservices.model.ParameterToValue" table="values_for_params">
   
<cache usage="read-write" include="all" />
   
<id name="id" column="ID">
       
<generator class="native"/>
   
</id>
   
<properties name="uniqueProps" unique="true">
       
<property name="containerId" index="ParamValsContainerIdIndx"/>
       
<property name="parameterId" index="ParamValsParamIdIndx"/>
       
<property name="containerType" column="CONTAINER_TYPE">
           
<type name="org.hibernate.type.EnumType">
               
<param name="enumClass">platform.server.dataservices.model.ContainerType</param>
               
<param name="type">4</param>
               
<!-- 12 = string, 5 = smallint, 4 = integer, default 4 -->
           
</type>
       
</property>
   
</properties>

   
<many-to-one name="value" cascade="all" lazy="false" unique="true" index="PRM_VAL_IDX"/>
</class>

 

SHOW CREATE TABLE values_for_params in MySQL:

 

CREATE TABLE `values_for_params` (
  ID
` bigint(20) NOT NULL AUTO_INCREMENT,
 
`containerId` bigint(20) DEFAULT NULL,
 
`parameterId` bigint(20) DEFAULT NULL,
 
`CONTAINER_TYPE` int(11) DEFAULT NULL,
 
`value` bigint(20) DEFAULT NULL,
PRIMARY KEY
(`ID`),
UNIQUE KEY
`value` (`value`),
UNIQUE KEY
`containerId` (`containerId`,`parameterId`,`CONTAINER_TYPE`),
KEY
`ParamValsParamIdIndx` (`parameterId`),
KEY
`ParamValsContainerIdIndx` (`containerId`),
KEY
`PRM_VAL_IDX` (`value`),
KEY
`FKE02CB4F981565307` (`value`),
CONSTRAINT
`FKE02CB4F981565307` FOREIGN KEY (`value`) REFERENCES `value` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

 

SHOW CREATE TABLE values_for_params_AUD in MySQL:

 

CREATE TABLE `values_for_params_AUD` (
 
`ID` bigint(20) NOT NULL,
 
`REV` int(11) NOT NULL,
 
`REVTYPE` tinyint(4) DEFAULT NULL,
 
`value` bigint(20) DEFAULT NULL,
PRIMARY KEY
(`ID`,`REV`),
KEY
`FKE093BE4AEB88DFB` (`REV`),
CONSTRAINT
`FKE093BE4AEB88DFB` FOREIGN KEY (`REV`) REFERENCES `DesignRevisionEntity`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

  • 1. Re: Missing properties in Envers auditing tables
    koval80 Newbie

    P.S.

    I added the @AuditOverride(name = "XXX",isAudited = true) annotations later, to try to force envers to audit these properties - but it didn't change anything.

  • 2. Re: Missing properties in Envers auditing tables
    Adam Warski Master

    @AuditOverride doesn't really apply here. So in fact no properties are in the audit tables, except the ids? Do you have other tables, where auditing works?

     

    Adam

  • 3. Re: Missing properties in Envers auditing tables
    koval80 Newbie

    Yes, no properties are in the audit tables, except the ids.

    I have many other entities that are audited correctly. The special thing here, as I see it, is that the (containerId, parameterId, containerType) triplet is defined as unique.

  • 4. Re: Missing properties in Envers auditing tables
    koval80 Newbie

    OK, fixed.

     

    The problem was that envers ignored whatever was written inside the properties tag. When I removed the tag this way:

      <properties name="uniqueProps" unique="true">
           
    <property name="containerId" index="ParamValsContainerIdIndx"/>
           
    <property name="parameterId" index="ParamValsParamIdIndx"/>
           
    <property name="containerType" column="CONTAINER_TYPE">
               
    <type name="org.hibernate.type.EnumType">
                   
    <param name="enumClass">platform.server.dataservices.model.ContainerType</param>
                   
    <param name="type">4</param>
                </type>
           
    </property>
       
    </properties>


    Became:

      <property name="containerId" index="ParamValsContainerIdIndx"/>
      <property name="parameterId" index="ParamValsParamIdIndx"/>
      <property name="containerType" column="CONTAINER_TYPE">
        <type name="org.hibernate.type.EnumType">
         
    <param name="enumClass">platform.server.dataservices.model.ContainerType</param>
         
    <param name="type">4</param>
        </type>
      </property>

     

    This way, all of the properties became audited, but I still needed the triplet (containerId, parameterId, containerType) to be unique. The final solution was this:

     

      <property name="containerId" index="ParamValsContainerIdIndx"/>
      <property name="parameterId" index="ParamValsParamIdIndx"/>
      <property name="containerType" column="CONTAINER_TYPE">
        <type name="org.hibernate.type.EnumType">
         
    <param name="enumClass">platform.server.dataservices.model.ContainerType</param>
         
    <param name="type">4</param>
        </type>
      </property>

      <properties name="uniqueProps" unique="true">
       
    <property name="containerId" insert="false" update="false"/>
       
    <property name="parameterId"
    insert="false" update="false"/>
       
    <property name="containerType"
    insert="false" update="false"/>
      </properties>

  • 5. Re: Missing properties in Envers auditing tables
    Adam Warski Master

    Huh, that's an ugly bug! But I'm glad that you found it

     

    Could you please report a JIRA?

     

    Thanks,

    Adam