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

    Missing properties in Envers auditing tables

    koval80

      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

          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
            adamw

            @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

              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

                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
                  adamw

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

                   

                  Could you please report a JIRA?

                   

                  Thanks,

                  Adam

                  • 6. Re: Missing properties in Envers auditing tables
                    koval80