[hibernate-commits] Hibernate SVN: r15481 - in core/trunk/envers/src: main/java/org/hibernate/envers/configuration/metadata and 17 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Nov 3 06:24:31 EST 2008


Author: adamw
Date: 2008-11-03 06:24:30 -0500 (Mon, 03 Nov 2008)
New Revision: 15481

Added:
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/PropertyData.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessType.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessTypeEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessTypeEntity.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessType.java
   core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessTypeEntity.java
Removed:
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassVersioningData.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PropertyStoreInfo.java
Modified:
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/AuditConfiguration.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/CompositeMapperBuilder.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MapPropertyMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SimpleMapperBuilder.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SubclassPropertyMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/AbstractCompositeIdMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/EmbeddedIdMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/MultipleIdMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/SingleIdMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/CommonCollectionMapperData.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/component/MiddleMapKeyPropertyComponentMapper.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqVersionsExpression.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionVersionsExpression.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/AbstractVersionsQuery.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/order/RevisionVersionsOrder.java
   core/trunk/envers/src/main/java/org/hibernate/envers/query/projection/RevisionVersionsProjection.java
   core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java
   core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoNumberReader.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AddWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/CollectionChangeWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/DelWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/ModWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java
   core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java
   core/trunk/envers/src/main/java/org/hibernate/envers/tools/reflection/ReflectionTools.java
   core/trunk/envers/src/test/resources/hibernate.test.cfg.xml
   core/trunk/envers/src/test/resources/testng.xml
Log:
HHH-3565: adding support for field and property access types; changed the way properties are read. Now, instead of a sole property name, a special "PropertyData" object is passed around which encapsulates the  property name and access type information.

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/AuditConfiguration.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/AuditConfiguration.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/AuditConfiguration.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -41,18 +41,18 @@
  */
 public class AuditConfiguration {
     private final GlobalConfiguration globalCfg;
-    private final AuditEntitiesConfiguration verEntCfg;
-    private final AuditSyncManager versionsSyncManager;
+    private final AuditEntitiesConfiguration auditEntCfg;
+    private final AuditSyncManager auditSyncManager;
     private final EntitiesConfigurations entCfg;
     private final RevisionInfoQueryCreator revisionInfoQueryCreator;
     private final RevisionInfoNumberReader revisionInfoNumberReader;
 
-    public AuditEntitiesConfiguration getVerEntCfg() {
-        return verEntCfg;
+    public AuditEntitiesConfiguration getAuditEntCfg() {
+        return auditEntCfg;
     }
 
     public AuditSyncManager getSyncManager() {
-        return versionsSyncManager;
+        return auditSyncManager;
     }
 
     public GlobalConfiguration getGlobalCfg() {
@@ -78,12 +78,12 @@
         ReflectionManager reflectionManager = ((AnnotationConfiguration) cfg).getReflectionManager();
         RevisionInfoConfiguration revInfoCfg = new RevisionInfoConfiguration();
         RevisionInfoConfigurationResult revInfoCfgResult = revInfoCfg.configure(cfg, reflectionManager);
-        verEntCfg = new AuditEntitiesConfiguration(properties, revInfoCfgResult.getRevisionInfoEntityName());
+        auditEntCfg = new AuditEntitiesConfiguration(properties, revInfoCfgResult.getRevisionInfoEntityName());
         globalCfg = new GlobalConfiguration(properties);
-        versionsSyncManager = new AuditSyncManager(revInfoCfgResult.getRevisionInfoGenerator());
+        auditSyncManager = new AuditSyncManager(revInfoCfgResult.getRevisionInfoGenerator());
         revisionInfoQueryCreator = revInfoCfgResult.getRevisionInfoQueryCreator();
         revisionInfoNumberReader = revInfoCfgResult.getRevisionInfoNumberReader();
-        entCfg = new EntitiesConfigurator().configure(cfg, reflectionManager, globalCfg, verEntCfg,
+        entCfg = new EntitiesConfigurator().configure(cfg, reflectionManager, globalCfg, auditEntCfg,
                 revInfoCfgResult.getRevisionInfoXmlMapping(), revInfoCfgResult.getRevisionInfoRelationMapping());
     }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/EntitiesConfigurator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -39,7 +39,7 @@
 import org.dom4j.io.XMLWriter;
 import org.hibernate.envers.configuration.metadata.AnnotationsMetadataReader;
 import org.hibernate.envers.configuration.metadata.EntityXmlMappingData;
-import org.hibernate.envers.configuration.metadata.PersistentClassVersioningData;
+import org.hibernate.envers.configuration.metadata.PersistentClassAuditingData;
 import org.hibernate.envers.configuration.metadata.AuditMetadataGenerator;
 import org.hibernate.envers.entities.EntitiesConfigurations;
 import org.hibernate.envers.tools.StringTools;
@@ -64,8 +64,8 @@
         // Sorting the persistent class topologically - superclass always before subclass
         Iterator<PersistentClass> classes = GraphTopologicalSort.sort(new PersistentClassGraphDefiner(cfg)).iterator();
 
-        Map<PersistentClass, PersistentClassVersioningData> pcDatas =
-                new HashMap<PersistentClass, PersistentClassVersioningData>();
+        Map<PersistentClass, PersistentClassAuditingData> pcDatas =
+                new HashMap<PersistentClass, PersistentClassAuditingData>();
         Map<PersistentClass, EntityXmlMappingData> xmlMappings = new HashMap<PersistentClass, EntityXmlMappingData>();
 
         // First pass
@@ -74,23 +74,23 @@
             // Collecting information from annotations on the persistent class pc
             AnnotationsMetadataReader annotationsMetadataReader =
                     new AnnotationsMetadataReader(globalCfg, reflectionManager, pc);
-            PersistentClassVersioningData versioningData = annotationsMetadataReader.getVersioningData();
+            PersistentClassAuditingData auditData = annotationsMetadataReader.getAuditData();
 
-            if (versioningData.isVersioned()) {
-                pcDatas.put(pc, versioningData);
+            if (auditData.isAudited()) {
+                pcDatas.put(pc, auditData);
 
-                if (!StringTools.isEmpty(versioningData.versionsTable.value())) {
-                    verEntCfg.addCustomVersionsTableName(pc.getEntityName(), versioningData.versionsTable.value());
+                if (!StringTools.isEmpty(auditData.getAuditTable().value())) {
+                    verEntCfg.addCustomVersionsTableName(pc.getEntityName(), auditData.getAuditTable().value());
                 }
 
                 EntityXmlMappingData xmlMappingData = new EntityXmlMappingData();
-                versionsMetaGen.generateFirstPass(pc, versioningData, xmlMappingData);
+                versionsMetaGen.generateFirstPass(pc, auditData, xmlMappingData);
                 xmlMappings.put(pc, xmlMappingData);
             }
         }
 
         // Second pass
-        for (Map.Entry<PersistentClass, PersistentClassVersioningData> pcDatasEntry : pcDatas.entrySet()) {
+        for (Map.Entry<PersistentClass, PersistentClassAuditingData> pcDatasEntry : pcDatas.entrySet()) {
             EntityXmlMappingData xmlMappingData = xmlMappings.get(pcDatasEntry.getKey());
 
             versionsMetaGen.generateSecondPass(pcDatasEntry.getKey(), pcDatasEntry.getValue(), xmlMappingData);

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/RevisionInfoConfiguration.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -30,6 +30,7 @@
 import org.dom4j.Element;
 import org.hibernate.envers.Audited;
 import org.hibernate.envers.*;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.configuration.metadata.MetadataTools;
 import org.hibernate.envers.revisioninfo.DefaultRevisionInfoGenerator;
 import org.hibernate.envers.revisioninfo.RevisionInfoGenerator;
@@ -49,16 +50,16 @@
  */
 public class RevisionInfoConfiguration {
     private String revisionInfoEntityName;
-    private String revisionInfoIdName;
-    private String revisionInfoTimestampName;
+    private PropertyData revisionInfoIdData;
+    private PropertyData revisionInfoTimestampData;
     private String revisionInfoTimestampType;
 
     private String revisionPropType;
 
     public RevisionInfoConfiguration() {
         revisionInfoEntityName = "org.hibernate.envers.DefaultRevisionEntity";
-        revisionInfoIdName = "id";
-        revisionInfoTimestampName = "timestamp";
+        revisionInfoIdData = new PropertyData("id", "field", null);
+        revisionInfoTimestampData = new PropertyData("timestamp", "field", null);
         revisionInfoTimestampType = "long";
 
         revisionPropType = "integer";
@@ -72,11 +73,11 @@
         class_mapping.addAttribute("name", revisionInfoEntityName);
         class_mapping.addAttribute("table", "_revisions_info");
 
-        Element idProperty = MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdName,
+        Element idProperty = MetadataTools.addNativelyGeneratedId(class_mapping, revisionInfoIdData.getName(),
                 revisionPropType);
         MetadataTools.addColumn(idProperty, "revision_id", null);
 
-        Element timestampProperty = MetadataTools.addProperty(class_mapping, revisionInfoTimestampName,
+        Element timestampProperty = MetadataTools.addProperty(class_mapping, revisionInfoTimestampData.getName(),
                 revisionInfoTimestampType, true, false);
         MetadataTools.addColumn(timestampProperty, "revision_timestamp", null);
 
@@ -107,11 +108,11 @@
                 XClass revisionNumberClass = property.getType();
                 if (reflectionManager.equals(revisionNumberClass, Integer.class) ||
                         reflectionManager.equals(revisionNumberClass, Integer.TYPE)) {
-                    revisionInfoIdName = property.getName();
+                    revisionInfoIdData = new PropertyData(property.getName(), accessType, null);
                     revisionNumberFound.set();
                 } else if (reflectionManager.equals(revisionNumberClass, Long.class) ||
                         reflectionManager.equals(revisionNumberClass, Long.TYPE)) {
-                    revisionInfoIdName = property.getName();
+                    revisionInfoIdData = new PropertyData(property.getName(), accessType, null);
                     revisionNumberFound.set();
 
                     // The default is integer
@@ -130,7 +131,7 @@
                 XClass revisionTimestampClass = property.getType();
                 if (reflectionManager.equals(revisionTimestampClass, Long.class) ||
                         reflectionManager.equals(revisionTimestampClass, Long.TYPE)) {
-                    revisionInfoTimestampName = property.getName();
+                    revisionInfoTimestampData = new PropertyData(property.getName(), accessType, null);
                     revisionTimestampFound.set();
                 } else {
                     throw new MappingException("The field annotated with @RevisionTimestamp must be of type " +
@@ -178,7 +179,7 @@
 
                 // Checking if custom revision entity isn't versioned
                 if (clazz.getAnnotation(Audited.class) != null) {
-                    throw new MappingException("An entity annotated with @RevisionEntity cannot be versioned!");
+                    throw new MappingException("An entity annotated with @RevisionEntity cannot be audited!");
                 }
 
                 revisionEntityFound = true;
@@ -202,7 +203,7 @@
 
                 revisionInfoClass = pc.getMappedClass();
                 revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass,
-                        revisionEntity.value(), revisionInfoTimestampName);
+                        revisionEntity.value(), revisionInfoTimestampData);
             }
         }
 
@@ -212,15 +213,16 @@
         if (revisionInfoGenerator == null) {
             revisionInfoClass = DefaultRevisionEntity.class;
             revisionInfoGenerator = new DefaultRevisionInfoGenerator(revisionInfoEntityName, revisionInfoClass,
-                    RevisionListener.class, revisionInfoTimestampName);
+                    RevisionListener.class, revisionInfoTimestampData);
             revisionInfoXmlMapping = generateDefaultRevisionInfoXmlMapping();
         }
 
         return new RevisionInfoConfigurationResult(
                 revisionInfoGenerator, revisionInfoXmlMapping,
-                new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdName, revisionInfoTimestampName),
+                new RevisionInfoQueryCreator(revisionInfoEntityName, revisionInfoIdData.getName(),
+                        revisionInfoTimestampData.getName()),
                 generateRevisionInfoRelationMapping(),
-                new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdName), revisionInfoEntityName);
+                new RevisionInfoNumberReader(revisionInfoClass, revisionInfoIdData), revisionInfoEntityName);
     }
 }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AnnotationsMetadataReader.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -24,11 +24,15 @@
 package org.hibernate.envers.configuration.metadata;
 
 import java.lang.annotation.Annotation;
+import java.util.Set;
+import java.util.Iterator;
 import javax.persistence.MapKey;
 import javax.persistence.Version;
+import javax.persistence.JoinColumn;
 
 import org.hibernate.envers.SecondaryAuditTable;
 import org.hibernate.envers.*;
+import org.hibernate.envers.tools.Tools;
 import org.hibernate.envers.configuration.GlobalConfiguration;
 
 import org.hibernate.MappingException;
@@ -36,6 +40,7 @@
 import org.hibernate.annotations.common.reflection.XClass;
 import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
 
 /**
  * A helper class to read versioning meta-data from annotations on a persistent class.
@@ -51,62 +56,105 @@
      * This object is filled with information read from annotations and returned by the <code>getVersioningData</code>
      * method.
      */
-    private final PersistentClassVersioningData versioningData;
+    private final PersistentClassAuditingData auditData;
 
+    /**
+     * Not null if the whole class is annotated with @Audited; the variable then holds the value of this
+     * annotation's "modStore" parameter.
+     */
+    private ModificationStore defaultStore;
+
+    private Set<String> propertyPersistentProperties;
+    private Set<String> fieldPersistentProperties;
+
     public AnnotationsMetadataReader(GlobalConfiguration globalCfg, ReflectionManager reflectionManager,
                                      PersistentClass pc) {
         this.globalCfg = globalCfg;
         this.reflectionManager = reflectionManager;
         this.pc = pc;
 
-        versioningData = new PersistentClassVersioningData();
-    }
+        auditData = new PersistentClassAuditingData();
 
-    private void addPropertyVersioned(XProperty property) {
-        Audited ver = property.getAnnotation(Audited.class);
-        if (ver != null) {
-            versioningData.propertyStoreInfo.propertyStores.put(property.getName(), ver.modStore());
-        }
+        propertyPersistentProperties = Tools.newHashSet();
+        fieldPersistentProperties = Tools.newHashSet();
     }
 
-    private void addPropertyMapKey(XProperty property) {
-        MapKey mapKey = property.getAnnotation(MapKey.class);
-        if (mapKey != null) {
-            versioningData.mapKeys.put(property.getName(), mapKey.name());
+    /**
+     * Checks if a property is audited and if yes, sets its modification store on the supplied property data.
+     * @param property Property to check.
+     * @param propertyData Property data, on which to set this property's modification store.
+     * @param persistentProperties Persistent properties with the access type of the given property.
+     * @return True, iff this property is audited.
+     */
+    private boolean ifPropertyAuditedAddStore(XProperty property, PersistentPropertyAuditingData propertyData,
+                                              Set<String> persistentProperties) {
+        // If this is not a persistent property, with the same access type as currently checked,
+        // it's not audited as well.
+        if (!persistentProperties.contains(property.getName())) {
+            return false;
         }
-    }
 
-    private void addPropertyUnversioned(XProperty property) {
-        // check if a property is declared as unversioned to exclude it
-        // useful if a class is versioned but some properties should be excluded
+        // check if a property is declared as not audited to exclude it
+        // useful if a class is audited but some properties should be excluded
         NotAudited unVer = property.getAnnotation(NotAudited.class);
         if (unVer != null) {
-            versioningData.unversionedProperties.add(property.getName());
+            return false;
         } else {
             // if the optimistic locking field has to be unversioned and the current property
-            // is the optimistic locking field, add it to the unversioned properties list
+            // is the optimistic locking field, don't audit it
             if (globalCfg.isUnversionedOptimisticLockingField()) {
                 Version jpaVer = property.getAnnotation(Version.class);
                 if (jpaVer != null) {
-                    versioningData.unversionedProperties.add(property.getName());
+                    return false;
                 }
             }
         }
+
+        // Checking if this property is explicitly audited or if all properties are.
+        Audited ver = property.getAnnotation(Audited.class);
+        if (ver != null) {
+            propertyData.setStore(ver.modStore());
+            return true;
+        } else {
+            if (defaultStore != null) {
+                propertyData.setStore(defaultStore);
+                return true;
+            } else {
+                return false;
+            }
+        }
     }
 
-    private void addPropertyJoinTables(XProperty property) {
+    private void addPropertyMapKey(XProperty property, PersistentPropertyAuditingData propertyData) {
+        MapKey mapKey = property.getAnnotation(MapKey.class);
+        if (mapKey != null) {
+            propertyData.setMapKey(mapKey.name());
+        }
+    }
+
+    private void addPropertyJoinTables(XProperty property, PersistentPropertyAuditingData propertyData) {
         AuditJoinTable joinTable = property.getAnnotation(AuditJoinTable.class);
         if (joinTable != null) {
-            versioningData.versionsJoinTables.put(property.getName(), joinTable);
+            propertyData.setJoinTable(joinTable);
+        } else {
+            propertyData.setJoinTable(getDefaultAuditJoinTable());
         }
     }
 
-    private void addFromProperties(Iterable<XProperty> properties) {
+    private void addFromProperties(Iterable<XProperty> properties, String accessType, Set<String> persistenProperties) {
         for (XProperty property : properties) {
-            addPropertyVersioned(property);
-            addPropertyUnversioned(property);
-            addPropertyJoinTables(property);
-            addPropertyMapKey(property);
+            PersistentPropertyAuditingData propertyData = new PersistentPropertyAuditingData();
+
+            if (ifPropertyAuditedAddStore(property, propertyData, persistenProperties)) {
+                // Now we know that the property is audited
+                auditData.getProperties().put(property.getName(), propertyData);
+
+                propertyData.setName(property.getName());
+                propertyData.setAccessType(accessType);
+
+                addPropertyJoinTables(property, propertyData);
+                addPropertyMapKey(property, propertyData);
+            }
         }
     }
 
@@ -116,24 +164,36 @@
             addPropertiesFromClass(superclazz);
         }
 
-        addFromProperties(clazz.getDeclaredProperties("field"));
-        addFromProperties(clazz.getDeclaredProperties("property"));
+        addFromProperties(clazz.getDeclaredProperties("field"), "field", fieldPersistentProperties);
+        addFromProperties(clazz.getDeclaredProperties("property"), "property", propertyPersistentProperties);
     }
 
-    private void addDefaultVersioned(XClass clazz) {
-        Audited defaultVersioned = clazz.getAnnotation(Audited.class);
+    private void readDefaultAudited(XClass clazz) {
+        Audited defaultAudited = clazz.getAnnotation(Audited.class);
 
-        if (defaultVersioned != null) {
-            versioningData.propertyStoreInfo.defaultStore = defaultVersioned.modStore();
+        if (defaultAudited != null) {
+            defaultStore = defaultAudited.modStore();
         }
     }
 
+    private void readPersistentProperties() {
+        Iterator propertyIter = pc.getPropertyIterator();
+        while (propertyIter.hasNext()) {
+            Property property = (Property) propertyIter.next();
+            if ("field".equals(property.getPropertyAccessorName())) {
+                fieldPersistentProperties.add(property.getName());
+            } else {
+                propertyPersistentProperties.add(property.getName());
+            }
+        }
+    }
+
     private void addVersionsTable(XClass clazz) {
-        AuditTable versionsTable = clazz.getAnnotation(AuditTable.class);
-        if (versionsTable != null) {
-            versioningData.versionsTable = versionsTable;
+        AuditTable auditTable = clazz.getAnnotation(AuditTable.class);
+        if (auditTable != null) {
+            auditData.setAuditTable(auditTable);
         } else {
-            versioningData.versionsTable = getDefaultVersionsTable();
+            auditData.setAuditTable(getDefaultAuditTable());
         }
     }
 
@@ -141,28 +201,30 @@
         // Getting information on secondary tables
         SecondaryAuditTable secondaryVersionsTable1 = clazz.getAnnotation(SecondaryAuditTable.class);
         if (secondaryVersionsTable1 != null) {
-            versioningData.secondaryTableDictionary.put(secondaryVersionsTable1.secondaryTableName(),
+            auditData.getSecondaryTableDictionary().put(secondaryVersionsTable1.secondaryTableName(),
                     secondaryVersionsTable1.secondaryVersionsTableName());
         }
 
         SecondaryAuditTables secondaryVersionsTables = clazz.getAnnotation(SecondaryAuditTables.class);
         if (secondaryVersionsTables != null) {
             for (SecondaryAuditTable secondaryVersionsTable2 : secondaryVersionsTables.value()) {
-                versioningData.secondaryTableDictionary.put(secondaryVersionsTable2.secondaryTableName(),
+                auditData.getSecondaryTableDictionary().put(secondaryVersionsTable2.secondaryTableName(),
                         secondaryVersionsTable2.secondaryVersionsTableName());
             }
         }
     }
 
-    public PersistentClassVersioningData getVersioningData() {
+    public PersistentClassAuditingData getAuditData() {
         if (pc.getClassName() == null) {
-            return versioningData;
+            return auditData;
         }
 
+        readPersistentProperties();
+
         try {
             XClass clazz = reflectionManager.classForName(pc.getClassName(), this.getClass());
 
-            addDefaultVersioned(clazz);
+            readDefaultAudited(clazz);
             addPropertiesFromClass(clazz);
             addVersionsTable(clazz);
             addVersionsSecondaryTables(clazz);
@@ -170,15 +232,35 @@
             throw new MappingException(e);
         }
 
-        return versioningData;
+        return auditData;
     }
 
-    private AuditTable getDefaultVersionsTable() {
-        return new AuditTable() {
-            public String value() { return ""; }
-            public String schema() { return ""; }
-            public String catalog() { return ""; }
-            public Class<? extends Annotation> annotationType() { return this.getClass(); }
-        };
+    private AuditTable defaultAuditTable;
+    private AuditTable getDefaultAuditTable() {
+        if (defaultAuditTable == null) {
+            defaultAuditTable =  new AuditTable() {
+                public String value() { return ""; }
+                public String schema() { return ""; }
+                public String catalog() { return ""; }
+                public Class<? extends Annotation> annotationType() { return this.getClass(); }
+            };
+        }
+
+        return defaultAuditTable;
     }
+
+    private AuditJoinTable defaultAuditJoinTable;
+    private AuditJoinTable getDefaultAuditJoinTable() {
+        if (defaultAuditJoinTable == null) {
+            defaultAuditJoinTable = new AuditJoinTable() {
+                public String name() { return ""; }
+                public String schema() { return ""; }
+                public String catalog() { return ""; }
+                public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
+                public Class<? extends Annotation> annotationType() { return this.getClass(); }
+            };
+        }
+
+        return defaultAuditJoinTable;
+    }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -25,12 +25,9 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 
 import org.dom4j.Element;
-import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.AuditJoinTable;
 import org.hibernate.envers.configuration.GlobalConfiguration;
 import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
 import org.hibernate.envers.entities.EntityConfiguration;
@@ -77,8 +74,8 @@
     private Logger log = LoggerFactory.getLogger(AuditMetadataGenerator.class);
 
     public AuditMetadataGenerator(Configuration cfg, GlobalConfiguration globalCfg,
-                                     AuditEntitiesConfiguration verEntCfg,
-                                     Element revisionInfoRelationMapping) {
+                                  AuditEntitiesConfiguration verEntCfg,
+                                  Element revisionInfoRelationMapping) {
         this.cfg = cfg;
         this.globalCfg = globalCfg;
         this.verEntCfg = verEntCfg;
@@ -106,38 +103,16 @@
         revTypeProperty.addAttribute("type", "org.hibernate.envers.entities.RevisionTypeType");
     }
 
-    private ModificationStore getStoreForProperty(Property property, PropertyStoreInfo propertyStoreInfo,
-                                                  List<String> unversionedProperties) {
-        /*
-         * Checks if a property is versioned, which is when:
-         * - the property isn't unversioned
-         * - the whole entity is versioned, then the default store is not null
-         * - there is a store defined for this entity, which is when this property is annotated 
-         */
-
-        if (unversionedProperties.contains(property.getName())) {
-            return null;
-        }
-
-        ModificationStore store = propertyStoreInfo.propertyStores.get(property.getName());
-
-        if (store == null) {
-            return propertyStoreInfo.defaultStore;
-        }
-
-        return store;
-    }
-
     @SuppressWarnings({"unchecked"})
-    void addValue(Element parent, String name, Value value, CompositeMapperBuilder currentMapper,
-                  ModificationStore store, String entityName, EntityXmlMappingData xmlMappingData,
-                  AuditJoinTable joinTable, String mapKey, boolean insertable, boolean firstPass) {
+    void addValue(Element parent,  Value value,  CompositeMapperBuilder currentMapper, String entityName,
+                  EntityXmlMappingData xmlMappingData,  PersistentPropertyAuditingData persistentPropertyAuditingData,
+                  boolean insertable, boolean firstPass) {
         Type type = value.getType();
 
         // only first pass
         if (firstPass) {
-            if (basicMetadataGenerator.addBasic(parent, name, value, currentMapper, store, entityName, insertable,
-                    false)) {
+            if (basicMetadataGenerator.addBasic(parent, persistentPropertyAuditingData, value, currentMapper,
+                    entityName, insertable, false)) {
                 // The property was mapped by the basic generator.
                 return;
             }
@@ -146,50 +121,49 @@
         if (type instanceof ManyToOneType) {
             // only second pass
             if (!firstPass) {
-                toOneRelationMetadataGenerator.addToOne(parent, name, value, currentMapper, entityName);
+                toOneRelationMetadataGenerator.addToOne(parent, persistentPropertyAuditingData, value, currentMapper,
+                        entityName);
             }
         } else if (type instanceof OneToOneType) {
             // only second pass
             if (!firstPass) {
-                toOneRelationMetadataGenerator.addOneToOneNotOwning(name, value, currentMapper, entityName);
+                toOneRelationMetadataGenerator.addOneToOneNotOwning(persistentPropertyAuditingData, value,
+                        currentMapper, entityName);
             }
         } else if (type instanceof CollectionType) {
             // only second pass
             if (!firstPass) {
                 CollectionMetadataGenerator collectionMetadataGenerator = new CollectionMetadataGenerator(this,
-                        name, (Collection) value, currentMapper, entityName, xmlMappingData, joinTable, mapKey);
+                        (Collection) value, currentMapper, entityName, xmlMappingData,
+                        persistentPropertyAuditingData);
                 collectionMetadataGenerator.addCollection();
             }
         } else {
             if (firstPass) {
                 // If we got here in the first pass, it means the basic mapper didn't map it, and none of the
                 // above branches either.
-                throwUnsupportedTypeException(type, entityName, name);
+                throwUnsupportedTypeException(type, entityName, persistentPropertyAuditingData.getName());
             }
         }
     }
 
     @SuppressWarnings({"unchecked"})
     private void addProperties(Element parent, Iterator<Property> properties, CompositeMapperBuilder currentMapper,
-                               PersistentClassVersioningData versioningData, String entityName, EntityXmlMappingData xmlMappingData,
+                               PersistentClassAuditingData versioningData, String entityName, EntityXmlMappingData xmlMappingData,
                                boolean firstPass) {
         while (properties.hasNext()) {
             Property property = properties.next();
-            if (!"_identifierMapper".equals(property.getName())) {
-                ModificationStore store = getStoreForProperty(property, versioningData.propertyStoreInfo,
-                        versioningData.unversionedProperties);
-
-                if (store != null) {
-                    addValue(parent, property.getName(), property.getValue(), currentMapper, store, entityName,
-                            xmlMappingData, versioningData.versionsJoinTables.get(property.getName()),
-                            versioningData.mapKeys.get(property.getName()), property.isInsertable(), firstPass);
-                }
+            String propertyName = property.getName();
+            if (versioningData.getPropertyAuditingData(propertyName) != null) {
+                addValue(parent, property.getValue(), currentMapper, entityName,
+                        xmlMappingData, versioningData.getPropertyAuditingData(propertyName),
+                        property.isInsertable(), firstPass);
             }
         }
     }
 
     @SuppressWarnings({"unchecked"})
-    private void createJoins(PersistentClass pc, Element parent, PersistentClassVersioningData versioningData) {
+    private void createJoins(PersistentClass pc, Element parent, PersistentClassAuditingData versioningData) {
         Iterator<Join> joins = pc.getJoinIterator();
 
         Map<Join, Element> joinElements = new HashMap<Join, Element>();
@@ -201,17 +175,17 @@
             // Determining the table name. If there is no entry in the dictionary, just constructing the table name
             // as if it was an entity (by appending/prepending configured strings).
             String originalTableName = join.getTable().getName();
-            String versionedTableName = versioningData.secondaryTableDictionary.get(originalTableName);
+            String versionedTableName = versioningData.getSecondaryTableDictionary().get(originalTableName);
             if (versionedTableName == null) {
                 versionedTableName = verEntCfg.getVersionsEntityName(originalTableName);
             }
 
-            String schema = versioningData.versionsTable.schema();
+            String schema = versioningData.getAuditTable().schema();
             if (StringTools.isEmpty(schema)) {
                 schema = join.getTable().getSchema();
             }
 
-            String catalog = versioningData.versionsTable.catalog();
+            String catalog = versioningData.getAuditTable().catalog();
             if (StringTools.isEmpty(catalog)) {
                 catalog = join.getTable().getCatalog();
             }
@@ -226,7 +200,7 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PersistentClassVersioningData versioningData,
+    private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper, PersistentClassAuditingData versioningData,
                           String entityName, EntityXmlMappingData xmlMappingData,boolean firstPass) {
         Iterator<Join> joins = pc.getJoinIterator();
 
@@ -240,14 +214,14 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    public void generateFirstPass(PersistentClass pc, PersistentClassVersioningData versioningData,
+    public void generateFirstPass(PersistentClass pc, PersistentClassAuditingData versioningData,
                                   EntityXmlMappingData xmlMappingData) {
-        String schema = versioningData.versionsTable.schema();
+        String schema = versioningData.getAuditTable().schema();
         if (StringTools.isEmpty(schema)) {
             schema = pc.getTable().getSchema();
         }
 
-        String catalog = versioningData.versionsTable.catalog();
+        String catalog = versioningData.getAuditTable().catalog();
         if (StringTools.isEmpty(catalog)) {
             catalog = pc.getTable().getCatalog();
         }
@@ -322,7 +296,7 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    public void generateSecondPass(PersistentClass pc, PersistentClassVersioningData versioningData,
+    public void generateSecondPass(PersistentClass pc, PersistentClassAuditingData versioningData,
                                    EntityXmlMappingData xmlMappingData) {
         String entityName = pc.getEntityName();
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -49,28 +49,28 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public final class BasicMetadataGenerator {
-    boolean addBasic(Element parent, String name, Value value, CompositeMapperBuilder mapper,
-                     ModificationStore store, String entityName, boolean insertable, boolean key) {
+    boolean addBasic(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
+                     CompositeMapperBuilder mapper, String entityName, boolean insertable, boolean key) {
         Type type = value.getType();
 
         if (type instanceof ComponentType) {
-            addComponent(parent, name, value, mapper, entityName, key);
+            addComponent(parent, persistentPropertyAuditingData, value, mapper, entityName, key);
             return true;
         } else {
-            return addBasicNoComponent(parent, name, value, mapper, store, insertable, key);
+            return addBasicNoComponent(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
         }
     }
 
-    boolean addBasicNoComponent(Element parent, String name, Value value, SimpleMapperBuilder mapper,
-                                ModificationStore store, boolean insertable, boolean key) {
+    boolean addBasicNoComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+                                Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
         Type type = value.getType();
 
         if (type instanceof ImmutableType || type instanceof MutableType) {
-            addSimpleValue(parent, name, value, mapper, store, insertable, key);
+            addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
         } else if (type instanceof CustomType || type instanceof CompositeCustomType) {
-            addCustomValue(parent, name, value, mapper, store, insertable, key);
+            addCustomValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
         } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
-            addSimpleValue(parent, name, value, mapper, store, insertable, key);
+            addSimpleValue(parent, persistentPropertyAuditingData, value, mapper, insertable, key);
         } else {
             return false;
         }
@@ -79,25 +79,25 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addSimpleValue(Element parent, String name, Value value, SimpleMapperBuilder mapper,
-                                ModificationStore store, boolean insertable, boolean key) {
+    private void addSimpleValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+                                Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
         if (parent != null) {
-            Element prop_mapping = MetadataTools.addProperty(parent, name,
+            Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
                     value.getType().getName(), insertable, key);
             MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
         }
 
         // A null mapper means that we only want to add xml mappings
         if (mapper != null) {
-            mapper.add(name, store);
+            mapper.add(persistentPropertyAuditingData.getPropertyData());
         }
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addCustomValue(Element parent, String name, Value value, SimpleMapperBuilder mapper,
-                                ModificationStore store, boolean insertable, boolean key) {
+    private void addCustomValue(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+                                Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
         if (parent != null) {
-            Element prop_mapping = MetadataTools.addProperty(parent, name,
+            Element prop_mapping = MetadataTools.addProperty(parent, persistentPropertyAuditingData.getName(),
                     null, insertable, key);
 
             //CustomType propertyType = (CustomType) value.getType();
@@ -120,7 +120,7 @@
         }
 
         if (mapper != null) {
-            mapper.add(name, store);
+            mapper.add(persistentPropertyAuditingData.getPropertyData());
         }
     }
 
@@ -131,8 +131,8 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    private void addComponent(Element parent, String name, Value value, CompositeMapperBuilder mapper,
-                              String entityName, boolean key) {
+    private void addComponent(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData,
+                              Value value, CompositeMapperBuilder mapper, String entityName, boolean key) {
         Element component_mapping = null;
         Component prop_component = (Component) value;
 
@@ -157,18 +157,19 @@
             */
 
             component_mapping = parent.addElement("component");
-            component_mapping.addAttribute("name", name);
+            component_mapping.addAttribute("name", persistentPropertyAuditingData.getName());
 
             addComponentClassName(component_mapping, prop_component);
         }
 
-        CompositeMapperBuilder componentMapper = mapper.addComposite(name);
+        CompositeMapperBuilder componentMapper = mapper.addComposite(persistentPropertyAuditingData.getPropertyData());
 
         Iterator<Property> properties = (Iterator<Property>) prop_component.getPropertyIterator();
         while (properties.hasNext()) {
             Property property = properties.next();
-            addBasic(component_mapping, property.getName(), property.getValue(), componentMapper,
-                    ModificationStore.FULL, entityName, property.isInsertable(), key);
+            addBasic(component_mapping,
+                    new PersistentPropertyAuditingData(property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL),
+                    property.getValue(), componentMapper, entityName, property.isInsertable(), key);
         }
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -23,7 +23,6 @@
  */
 package org.hibernate.envers.configuration.metadata;
 
-import java.lang.annotation.Annotation;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -37,7 +36,6 @@
 
 import org.dom4j.Element;
 import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.AuditJoinTable;
 import org.hibernate.envers.entities.EntityConfiguration;
 import org.hibernate.envers.entities.IdMappingData;
 import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
@@ -91,8 +89,7 @@
     private final CompositeMapperBuilder currentMapper;
     private final String referencingEntityName;
     private final EntityXmlMappingData xmlMappingData;
-    private final AuditJoinTable joinTable;
-    private final String mapKey;
+    private final PersistentPropertyAuditingData persistentPropertyAuditingData;
 
     private final EntityConfiguration referencingEntityConfiguration;
     /**
@@ -102,30 +99,29 @@
 
     /**
      * @param mainGenerator Main generator, giving access to configuration and the basic mapper.
-     * @param propertyName Name of the property that references the collection in the referencing entity.
      * @param propertyValue Value of the collection, as mapped by Hibernate.
      * @param currentMapper Mapper, to which the appropriate {@link org.hibernate.envers.entities.mapper.PropertyMapper}
      * will be added.
      * @param referencingEntityName Name of the entity that owns this collection.
      * @param xmlMappingData In case this collection requires a middle table, additional mapping documents will
      * be created using this object.
-     * @param joinTable User data for the middle (join) table. <code>null</code> if the user didn't specify it.
-     * @param mapKey The value of the name() property of the MapKey annotation on this property. Null, if this
-     * property isn't annotated with this annotation.
+     * @param persistentPropertyAuditingData Property auditing (meta-)data. Among other things, holds the name of the
+     * property that references the collection in the referencing entity, the user data for middle (join)
+     * table and the value of the <code>@MapKey</code> annotation, if there was one. 
      */
-    public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator, String propertyName,
+    public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
                                        Collection propertyValue, CompositeMapperBuilder currentMapper,
                                        String referencingEntityName, EntityXmlMappingData xmlMappingData,
-                                       AuditJoinTable joinTable, String mapKey) {
+                                       PersistentPropertyAuditingData persistentPropertyAuditingData) {
         this.mainGenerator = mainGenerator;
-        this.propertyName = propertyName;
         this.propertyValue = propertyValue;
         this.currentMapper = currentMapper;
         this.referencingEntityName = referencingEntityName;
         this.xmlMappingData = xmlMappingData;
-        this.joinTable = joinTable == null ? getDefaultVersionsJoinTable() : joinTable;
-        this.mapKey = mapKey;
+        this.persistentPropertyAuditingData = persistentPropertyAuditingData;
 
+        this.propertyName = persistentPropertyAuditingData.getName();
+
         referencingEntityConfiguration = mainGenerator.getEntitiesConfigurations().get(referencingEntityName);
         if (referencingEntityConfiguration == null) {
             throw new MappingException("Unable to read versioning configuration for " + referencingEntityName + "!");
@@ -192,7 +188,8 @@
 
         // Creating common mapper data.
         CommonCollectionMapperData commonCollectionMapperData = new CommonCollectionMapperData(
-                mainGenerator.getVerEntCfg(), referencedEntityName, propertyName,
+                mainGenerator.getVerEntCfg(), referencedEntityName,
+                persistentPropertyAuditingData.getPropertyData(),
                 referencingIdData, queryGenerator);
 
         // Checking the type of the collection and adding an appropriate mapper.
@@ -238,9 +235,9 @@
         // Generating the name of the middle table
         String versionsMiddleTableName;
         String versionsMiddleEntityName;
-        if (!StringTools.isEmpty(joinTable.name())) {
-            versionsMiddleTableName = joinTable.name();
-            versionsMiddleEntityName = joinTable.name();
+        if (!StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().name())) {
+            versionsMiddleTableName = persistentPropertyAuditingData.getJoinTable().name();
+            versionsMiddleEntityName = persistentPropertyAuditingData.getJoinTable().name();
         } else {
             String middleTableName = getMiddleTableName(propertyValue, referencingEntityName);
             versionsMiddleTableName = mainGenerator.getVerEntCfg().getVersionsTableName(null, middleTableName);
@@ -304,7 +301,7 @@
         // Generating the element mapping.
         // ******
         MiddleComponentData elementComponentData = addValueToMiddleTable(propertyValue.getElement(), middleEntityXml,
-                queryGeneratorBuilder, referencedPrefix, joinTable.inverseJoinColumns());
+                queryGeneratorBuilder, referencedPrefix, persistentPropertyAuditingData.getJoinTable().inverseJoinColumns());
 
         // ******
         // Generating the index mapping, if an index exists.
@@ -319,7 +316,9 @@
 
         // Creating common data
         CommonCollectionMapperData commonCollectionMapperData = new CommonCollectionMapperData(
-                mainGenerator.getVerEntCfg(), versionsMiddleEntityName, propertyName, referencingIdData, queryGenerator);
+                mainGenerator.getVerEntCfg(), versionsMiddleEntityName,
+                persistentPropertyAuditingData.getPropertyData(),
+                referencingIdData, queryGenerator);
 
         // Checking the type of the collection and adding an appropriate mapper.
         addMapper(commonCollectionMapperData, elementComponentData, indexComponentData);
@@ -333,6 +332,7 @@
     private MiddleComponentData addIndex(Element middleEntityXml, QueryGeneratorBuilder queryGeneratorBuilder) {
         if (propertyValue instanceof IndexedCollection) {
             IndexedCollection indexedValue = (IndexedCollection) propertyValue;
+            String mapKey = persistentPropertyAuditingData.getMapKey();
             if (mapKey == null) {
                 // This entity doesn't specify a javax.persistence.MapKey. Mapping it to the middle entity.
                 return addValueToMiddleTable(indexedValue.getIndex(), middleEntityXml,
@@ -347,7 +347,8 @@
                             referencedIdMapping.getIdMapper()), currentIndex);
                 } else {
                     // The key of the map is a property of the entity.
-                    return new MiddleComponentData(new MiddleMapKeyPropertyComponentMapper(mapKey), currentIndex);
+                    return new MiddleComponentData(new MiddleMapKeyPropertyComponentMapper(mapKey,
+                            persistentPropertyAuditingData.getAccessType()), currentIndex);
                 }
             }
         } else {
@@ -399,8 +400,9 @@
                     queryGeneratorBuilder.getCurrentIndex());
         } else {
             // Last but one parameter: collection components are always insertable
-            boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(xmlMapping, prefix, value, null,
-                    ModificationStore.FULL, true, true);
+            boolean mapped = mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(xmlMapping,
+                    new PersistentPropertyAuditingData(prefix, "field", ModificationStore.FULL), value, null,
+                    true, true);
 
             if (mapped) {
                 // Simple values are always stored in the first item of the array returned by the query generator.
@@ -417,25 +419,31 @@
                            MiddleComponentData indexComponentData) {
         Type type = propertyValue.getType();
         if (type instanceof SortedSetType) {
-            currentMapper.addComposite(propertyName, new BasicCollectionMapper<Set>(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new BasicCollectionMapper<Set>(commonCollectionMapperData,
                     TreeSet.class, SortedSetProxy.class, elementComponentData));
         } else if (type instanceof SetType) {
-            currentMapper.addComposite(propertyName, new BasicCollectionMapper<Set>(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new BasicCollectionMapper<Set>(commonCollectionMapperData,
                     HashSet.class, SetProxy.class, elementComponentData));
         } else if (type instanceof SortedMapType) {
             // Indexed collection, so <code>indexComponentData</code> is not null.
-            currentMapper.addComposite(propertyName, new MapCollectionMapper<Map>(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new MapCollectionMapper<Map>(commonCollectionMapperData,
                     TreeMap.class, SortedMapProxy.class, elementComponentData, indexComponentData));
         } else if (type instanceof MapType) {
             // Indexed collection, so <code>indexComponentData</code> is not null.
-            currentMapper.addComposite(propertyName, new MapCollectionMapper<Map>(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new MapCollectionMapper<Map>(commonCollectionMapperData,
                     HashMap.class, MapProxy.class, elementComponentData, indexComponentData));
         } else if (type instanceof BagType) {
-            currentMapper.addComposite(propertyName, new BasicCollectionMapper<List>(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new BasicCollectionMapper<List>(commonCollectionMapperData,
                     ArrayList.class, ListProxy.class, elementComponentData));
         } else if (type instanceof ListType) {
             // Indexed collection, so <code>indexComponentData</code> is not null.
-            currentMapper.addComposite(propertyName, new ListCollectionMapper(commonCollectionMapperData,
+            currentMapper.addComposite(persistentPropertyAuditingData.getPropertyData(),
+                    new ListCollectionMapper(commonCollectionMapperData,
                     elementComponentData, indexComponentData));
         } else {
             mainGenerator.throwUnsupportedTypeException(type, referencingEntityName, propertyName);
@@ -454,8 +462,10 @@
     }
 
     private Element createMiddleEntityXml(String versionsMiddleTableName, String versionsMiddleEntityName) {
-        String schema = StringTools.isEmpty(joinTable.schema()) ? propertyValue.getCollectionTable().getSchema() : joinTable.schema();
-        String catalog = StringTools.isEmpty(joinTable.catalog()) ? propertyValue.getCollectionTable().getCatalog() : joinTable.catalog();
+        String schema = StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().schema()) ?
+                propertyValue.getCollectionTable().getSchema() : persistentPropertyAuditingData.getJoinTable().schema();
+        String catalog = StringTools.isEmpty(persistentPropertyAuditingData.getJoinTable().catalog()) ?
+                propertyValue.getCollectionTable().getCatalog() : persistentPropertyAuditingData.getJoinTable().catalog();
 
         Element middleEntityXml = MetadataTools.createEntity(xmlMappingData.newAdditionalMapping(),
                 versionsMiddleEntityName, versionsMiddleTableName, schema, catalog, null);
@@ -474,16 +484,6 @@
         return middleEntityXmlId;
     }
 
-    private AuditJoinTable getDefaultVersionsJoinTable() {
-        return new AuditJoinTable() {
-            public String name() { return ""; }
-            public String schema() { return ""; }
-            public String catalog() { return ""; }
-            public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
-            public Class<? extends Annotation> annotationType() { return this.getClass(); }
-        };
-    }
-
     @SuppressWarnings({"unchecked"})
     private String getMappedBy(Collection collectionValue) {
         Iterator<Property> assocClassProps =

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/IdMetadataGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -29,6 +29,7 @@
 import org.dom4j.tree.DefaultElement;
 import org.hibernate.envers.ModificationStore;
 import org.hibernate.envers.entities.IdMappingData;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.entities.mapper.SimpleMapperBuilder;
 import org.hibernate.envers.entities.mapper.id.EmbeddedIdMapper;
 import org.hibernate.envers.entities.mapper.id.MultipleIdMapper;
@@ -61,8 +62,9 @@
             if (!"_identifierMapper".equals(property.getName())) {
                 if (propertyType instanceof ImmutableType) {
                     // Last but one parameter: ids are always insertable
-                    mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(parent, property.getName(),
-                            property.getValue(), mapper, ModificationStore.FULL, true, key);
+                    mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(parent,
+                            getIdPersistentPropertyAuditingData(property),
+                            property.getValue(), mapper, true, key);
                 } else {
                     throw new MappingException("Type not supported: " + propertyType.getClass().getName());
                 }
@@ -94,7 +96,7 @@
 
             Component id_component = (Component) id_prop.getValue();
 
-            mapper = new EmbeddedIdMapper(id_prop.getName(), id_component.getComponentClassName());
+            mapper = new EmbeddedIdMapper(getIdPropertyData(id_prop), id_component.getComponentClassName());
             addIdProperties(rel_id_mapping, (Iterator<Property>) id_component.getPropertyIterator(), mapper, false);
 
             // null mapper - the mapping where already added the first time, now we only want to generate the xml
@@ -105,12 +107,14 @@
             mapper = new SingleIdMapper();
 
             // Last but one parameter: ids are always insertable
-            mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(rel_id_mapping, id_prop.getName(),
-                    id_prop.getValue(), mapper, ModificationStore.FULL, true, false);
+            mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(rel_id_mapping,
+                    getIdPersistentPropertyAuditingData(id_prop),
+                    id_prop.getValue(), mapper, true, false);
 
             // null mapper - the mapping where already added the first time, now we only want to generate the xml
-            mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(orig_id_mapping, id_prop.getName(),
-                    id_prop.getValue(), null, ModificationStore.FULL, true, true);
+            mainGenerator.getBasicMetadataGenerator().addBasicNoComponent(orig_id_mapping,
+                    getIdPersistentPropertyAuditingData(id_prop),
+                    id_prop.getValue(), null, true, true);
         }
 
         orig_id_mapping.addAttribute("name", mainGenerator.getVerEntCfg().getOriginalIdPropName());
@@ -120,4 +124,13 @@
 
         return new IdMappingData(mapper, orig_id_mapping, rel_id_mapping);
     }
+
+    private PropertyData getIdPropertyData(Property property) {
+        return new PropertyData(property.getName(), property.getPropertyAccessorName(), ModificationStore.FULL);
+    }
+
+    private PersistentPropertyAuditingData getIdPersistentPropertyAuditingData(Property property) {
+        return new PersistentPropertyAuditingData(property.getName(), property.getPropertyAccessorName(),
+                ModificationStore.FULL);
+    }
 }

Copied: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java (from rev 15464, core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassVersioningData.java)
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java	                        (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassAuditingData.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,72 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.configuration.metadata;
+
+import java.util.Map;
+
+import org.hibernate.envers.AuditTable;
+import org.hibernate.envers.tools.Tools;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ * @author Sebastian Komander
+*/
+public class PersistentClassAuditingData {
+    public PersistentClassAuditingData() {
+        properties = Tools.newHashMap();
+        secondaryTableDictionary = Tools.newHashMap();
+    }
+
+    private Map<String, PersistentPropertyAuditingData> properties;
+    private AuditTable auditTable;
+    private Map<String, String> secondaryTableDictionary;
+
+    public Map<String, PersistentPropertyAuditingData> getProperties() {
+        return properties;
+    }
+
+    public PersistentPropertyAuditingData getPropertyAuditingData(String propertyName) {
+        return properties.get(propertyName);
+    }
+
+    public Map<String, String> getSecondaryTableDictionary() {
+        return secondaryTableDictionary;
+    }
+
+    public AuditTable getAuditTable() {
+        return auditTable;
+    }
+
+    public void setAuditTable(AuditTable auditTable) {
+        this.auditTable = auditTable;
+    }
+
+    public boolean isAudited() {
+        if (properties.size() > 0) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+}

Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassVersioningData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassVersioningData.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentClassVersioningData.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -1,67 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.envers.configuration.metadata;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.envers.ModificationStore;
-import org.hibernate.envers.AuditJoinTable;
-import org.hibernate.envers.AuditTable;
-
-/**
- * @author Adam Warski (adam at warski dot org)
- * @author Sebastian Komander
-*/
-public class PersistentClassVersioningData {
-    public PersistentClassVersioningData() {
-        propertyStoreInfo = new PropertyStoreInfo(new HashMap<String, ModificationStore>());
-        secondaryTableDictionary = new HashMap<String, String>();
-        unversionedProperties = new ArrayList<String>();
-        versionsJoinTables = new HashMap<String, AuditJoinTable>();
-        mapKeys = new HashMap<String, String>();
-    }
-
-    public PropertyStoreInfo propertyStoreInfo;
-    public AuditTable versionsTable;
-    public Map<String, String> secondaryTableDictionary;
-    public List<String> unversionedProperties;
-    /**
-     * A map from property names to custom join tables definitions.
-     */
-    public Map<String, AuditJoinTable> versionsJoinTables;
-    /**
-     * A map from property names to the value of the related property names in a map key annotation. An empty string,
-     * if the property name is not specified in the mapkey annotation.
-     */
-    public Map<String, String> mapKeys;
-
-    public boolean isVersioned() {
-        if (propertyStoreInfo.propertyStores.size() > 0) { return true; }
-        if (propertyStoreInfo.defaultStore != null) { return true; }
-        return false;
-    }
-}

Added: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java	                        (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PersistentPropertyAuditingData.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,93 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ *
+ */
+package org.hibernate.envers.configuration.metadata;
+
+import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.AuditJoinTable;
+import org.hibernate.envers.entities.PropertyData;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PersistentPropertyAuditingData {
+    private String name;
+    private ModificationStore store;
+    private String mapKey;
+    private AuditJoinTable joinTable;
+    private String accessType;
+
+    public PersistentPropertyAuditingData() {
+    }
+
+    public PersistentPropertyAuditingData(String name, String accessType, ModificationStore store) {
+        this.name = name;
+        this.accessType = accessType;
+        this.store = store;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ModificationStore getStore() {
+        return store;
+    }
+
+    public void setStore(ModificationStore store) {
+        this.store = store;
+    }
+
+    public String getMapKey() {
+        return mapKey;
+    }
+
+    public void setMapKey(String mapKey) {
+        this.mapKey = mapKey;
+    }
+
+    public AuditJoinTable getJoinTable() {
+        return joinTable;
+    }
+
+    public void setJoinTable(AuditJoinTable joinTable) {
+        this.joinTable = joinTable;
+    }
+
+    public String getAccessType() {
+        return accessType;
+    }
+
+    public void setAccessType(String accessType) {
+        this.accessType = accessType;
+    }
+
+    public PropertyData getPropertyData() {
+        return new PropertyData(name, accessType, store);
+    }
+}

Deleted: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PropertyStoreInfo.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PropertyStoreInfo.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/PropertyStoreInfo.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -1,48 +0,0 @@
-/*
- * Hibernate, Relational Persistence for Idiomatic Java
- *
- * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat Middleware LLC.
- *
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.envers.configuration.metadata;
-
-import java.util.Map;
-
-import org.hibernate.envers.ModificationStore;
-
-/**
- * @author Adam Warski (adam at warski dot org)
-*/
-public class PropertyStoreInfo {
-    // Not null if the whole class is versioned
-    public ModificationStore defaultStore;
-
-    // Maps property names to their stores defined in per-field versioned annotations
-    public Map<String, ModificationStore> propertyStores;
-
-    public PropertyStoreInfo(Map<String, ModificationStore> propertyStores) {
-        this.propertyStores = propertyStores;
-    }
-
-    public PropertyStoreInfo(ModificationStore defaultStore, Map<String, ModificationStore> propertyStores) {
-        this.defaultStore = defaultStore;
-        this.propertyStores = propertyStores;
-    }
-}

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/configuration/metadata/ToOneRelationMetadataGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -26,6 +26,7 @@
 import org.dom4j.Element;
 import org.hibernate.envers.entities.EntityConfiguration;
 import org.hibernate.envers.entities.IdMappingData;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.entities.mapper.CompositeMapperBuilder;
 import org.hibernate.envers.entities.mapper.id.IdMapper;
 import org.hibernate.envers.entities.mapper.relation.OneToOneNotOwningMapper;
@@ -48,7 +49,8 @@
     }
 
     @SuppressWarnings({"unchecked"})
-    void addToOne(Element parent, String name, Value value, CompositeMapperBuilder mapper, String entityName) {
+    void addToOne(Element parent, PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
+                  CompositeMapperBuilder mapper, String entityName) {
         String referencedEntityName = ((ToOne) value).getReferencedEntityName();
 
         EntityConfiguration configuration = mainGenerator.getEntitiesConfigurations().get(referencedEntityName);
@@ -58,28 +60,31 @@
 
         IdMappingData idMapping = configuration.getIdMappingData();
 
-        String lastPropertyPrefix = name + "_";
+        String lastPropertyPrefix = persistentPropertyAuditingData.getName() + "_";
 
         // Generating the id mapper for the relation
         IdMapper relMapper = idMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix);
 
         // Storing information about this relation
-        mainGenerator.getEntitiesConfigurations().get(entityName).addToOneRelation(name, referencedEntityName, relMapper);
+        mainGenerator.getEntitiesConfigurations().get(entityName).addToOneRelation(
+                persistentPropertyAuditingData.getName(), referencedEntityName, relMapper);
 
         // Adding an element to the mapping corresponding to the references entity id's
         Element properties = (Element) idMapping.getXmlRelationMapping().clone();
-        properties.addAttribute("name", name);
+        properties.addAttribute("name", persistentPropertyAuditingData.getName());
 
         MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix,
                 MetadataTools.getColumnNameIterator(value.getColumnIterator()), false);
         parent.add(properties);
 
         // Adding mapper for the id
-        mapper.addComposite(name, new ToOneIdMapper(relMapper, name, referencedEntityName));
+        PropertyData propertyData = persistentPropertyAuditingData.getPropertyData();
+        mapper.addComposite(propertyData, new ToOneIdMapper(relMapper, propertyData, referencedEntityName));
     }
 
     @SuppressWarnings({"unchecked"})
-    void addOneToOneNotOwning(String name, Value value, CompositeMapperBuilder mapper, String entityName) {
+    void addOneToOneNotOwning(PersistentPropertyAuditingData persistentPropertyAuditingData, Value value,
+                              CompositeMapperBuilder mapper, String entityName) {
         OneToOne propertyValue = (OneToOne) value;
 
         String owningReferencePropertyName = propertyValue.getReferencedPropertyName(); // mappedBy
@@ -102,11 +107,13 @@
         IdMapper ownedIdMapper = ownedIdMapping.getIdMapper().prefixMappedProperties(lastPropertyPrefix);
 
         // Storing information about this relation
-        mainGenerator.getEntitiesConfigurations().get(entityName).addToOneNotOwningRelation(name, owningReferencePropertyName,
+        mainGenerator.getEntitiesConfigurations().get(entityName).addToOneNotOwningRelation(
+                persistentPropertyAuditingData.getName(), owningReferencePropertyName,
                 referencedEntityName, ownedIdMapper);
 
         // Adding mapper for the id
-        mapper.addComposite(name, new OneToOneNotOwningMapper(owningReferencePropertyName,
-                referencedEntityName, name));
+        PropertyData propertyData = persistentPropertyAuditingData.getPropertyData();
+        mapper.addComposite(propertyData, new OneToOneNotOwningMapper(owningReferencePropertyName,
+                referencedEntityName, propertyData));
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -67,7 +67,7 @@
 
         // First mapping the primary key
         IdMapper idMapper = verCfg.getEntCfg().get(entityName).getIdMapper();
-        Map originalId = (Map) versionsEntity.get(verCfg.getVerEntCfg().getOriginalIdPropName());
+        Map originalId = (Map) versionsEntity.get(verCfg.getAuditEntCfg().getOriginalIdPropName());
 
         Object primaryKey = idMapper.mapToIdFromMap(originalId);
 

Added: core/trunk/envers/src/main/java/org/hibernate/envers/entities/PropertyData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/PropertyData.java	                        (rev 0)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/PropertyData.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,70 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.entities;
+
+import org.hibernate.envers.ModificationStore;
+
+/**
+ * Holds information on a property that is audited.
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PropertyData {
+    private final String name;
+    private final String accessType;
+    private final ModificationStore store;
+
+    /**
+     * Copies the given property data, except the name.
+     * @param newName New name.
+     * @param propertyData Property data to copy the rest of properties from.
+     */
+    public PropertyData(String newName, PropertyData propertyData) {
+        this.name = newName;
+        this.accessType = propertyData.accessType;
+        this.store = propertyData.store;
+    }
+
+    /**
+     * @param name Name of the property.
+     * @param accessType Accessor type for this property.
+     * @param store How this property should be stored.
+     */
+    public PropertyData(String name, String accessType, ModificationStore store) {
+        this.name = name;
+        this.accessType = accessType;
+        this.store = store;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getAccessType() {
+        return accessType;
+    }
+
+    public ModificationStore getStore() {
+        return store;
+    }
+}

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/CompositeMapperBuilder.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/CompositeMapperBuilder.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/CompositeMapperBuilder.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -23,10 +23,12 @@
  */
 package org.hibernate.envers.entities.mapper;
 
+import org.hibernate.envers.entities.PropertyData;
+
 /**
  * @author Adam Warski (adam at warski dot org)
  */
 public interface CompositeMapperBuilder extends SimpleMapperBuilder {    
-    public CompositeMapperBuilder addComposite(String propertyName);
-    public void addComposite(String propertyName, PropertyMapper propertyMapper);
+    public CompositeMapperBuilder addComposite(PropertyData propertyData);
+    public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper);
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MapPropertyMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MapPropertyMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MapPropertyMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -28,7 +28,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.reader.AuditReaderImplementor;
@@ -43,29 +43,29 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public class MapPropertyMapper implements PropertyMapper, CompositeMapperBuilder {
-    private String propertyName;
+    private PropertyData propertyData;
     private ExtendedPropertyMapper delegate;
 
-    public MapPropertyMapper(String propertyName) {
-        this.propertyName = propertyName;
+    public MapPropertyMapper(PropertyData propertyData) {
+        this.propertyData = propertyData;
         this.delegate = new MultiPropertyMapper();
     }
 
-    public void add(String propertyName, ModificationStore modStore) {
-        delegate.add(propertyName, modStore);
+    public void add(PropertyData propertyData) {
+        delegate.add(propertyData);
     }
 
-    public CompositeMapperBuilder addComposite(String propertyName) {
-        return delegate.addComposite(propertyName);
+    public CompositeMapperBuilder addComposite(PropertyData propertyData) {
+        return delegate.addComposite(propertyData);
     }
 
-    public void addComposite(String propertyName, PropertyMapper propertyMapper) {
-        delegate.addComposite(propertyName, propertyMapper);
+    public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
+        delegate.addComposite(propertyData, propertyMapper);
     }
 
     public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
         Map<String, Object> newData = new HashMap<String, Object>();
-        data.put(propertyName, newData);
+        data.put(propertyData.getName(), newData);
 
         return delegate.mapToMapFromEntity(newData, newObj, oldObj);
     }
@@ -75,13 +75,13 @@
             return;
         }
 
-        Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyName);
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName);
+        Getter getter = ReflectionTools.getGetter(obj.getClass(), propertyData);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
 
         try {
             Object subObj = ReflectHelper.getDefaultConstructor(getter.getReturnType()).newInstance();
             setter.set(obj, subObj, null);
-            delegate.mapToEntityFromMap(verCfg, subObj, (Map) data.get(propertyName), primaryKey, versionsReader, revision);
+            delegate.mapToEntityFromMap(verCfg, subObj, (Map) data.get(propertyData.getName()), primaryKey, versionsReader, revision);
         } catch (Exception e) {
             throw new AuditException(e);
         }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/MultiPropertyMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -24,14 +24,14 @@
 package org.hibernate.envers.entities.mapper;
 
 import java.io.Serializable;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
+import org.hibernate.envers.tools.Tools;
 
 import org.hibernate.MappingException;
 import org.hibernate.collection.PersistentCollection;
@@ -41,31 +41,36 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public class MultiPropertyMapper implements ExtendedPropertyMapper {
-    protected Map<String, PropertyMapper> properties;
+    protected final Map<PropertyData, PropertyMapper> properties;
+    private final Map<String, PropertyData> propertyDatas;
 
     public MultiPropertyMapper() {
-        properties = new HashMap<String, PropertyMapper>();
+        properties = Tools.newHashMap();
+        propertyDatas = Tools.newHashMap();
     }
 
-    public void add(String propertyName, ModificationStore modStore) {
+    public void add(PropertyData propertyData) {
         SinglePropertyMapper single = new SinglePropertyMapper();
-        single.add(propertyName,  modStore);
-        properties.put(propertyName, single);
+        single.add(propertyData);
+        properties.put(propertyData, single);
+        propertyDatas.put(propertyData.getName(), propertyData);
     }
 
-    public CompositeMapperBuilder addComposite(String propertyName) {
-        if (properties.get(propertyName) != null) {
-            throw new MappingException("Mapping for " + propertyName + " already added!");
+    public CompositeMapperBuilder addComposite(PropertyData propertyData) {
+        if (properties.get(propertyData) != null) {
+            throw new MappingException("Mapping for " + propertyData.getName() + " already added!");
         }
 
-        MapPropertyMapper mapperBuilder = new MapPropertyMapper(propertyName);
-        properties.put(propertyName, mapperBuilder);
+        MapPropertyMapper mapperBuilder = new MapPropertyMapper(propertyData);
+        properties.put(propertyData, mapperBuilder);
+        propertyDatas.put(propertyData.getName(), propertyData);
 
         return mapperBuilder;
     }
 
-    public void addComposite(String propertyName, PropertyMapper propertyMapper) {
-        properties.put(propertyName, propertyMapper);
+    public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
+        properties.put(propertyData, propertyMapper);
+        propertyDatas.put(propertyData.getName(), propertyData);
     }
 
     private Object getAtIndexOrNull(Object[] array, int index) { return array == null ? null : array[index]; }
@@ -75,8 +80,8 @@
         for (int i=0; i<propertyNames.length; i++) {
             String propertyName = propertyNames[i];
 
-            if (properties.containsKey(propertyName)) {
-                ret |= properties.get(propertyName).mapToMapFromEntity(data,
+            if (propertyDatas.containsKey(propertyName)) {
+                ret |= properties.get(propertyDatas.get(propertyName)).mapToMapFromEntity(data,
                         getAtIndexOrNull(newState, i),
                         getAtIndexOrNull(oldState, i));
             }
@@ -87,17 +92,17 @@
 
     public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
         boolean ret = false;
-        for (String propertyName : properties.keySet()) {
+        for (PropertyData propertyData : properties.keySet()) {
             Getter getter;
             if (newObj != null) {
-                getter = ReflectionTools.getGetter(newObj.getClass(), propertyName);
+                getter = ReflectionTools.getGetter(newObj.getClass(), propertyData);
             } else if (oldObj != null) {
-                getter = ReflectionTools.getGetter(oldObj.getClass(), propertyName);
+                getter = ReflectionTools.getGetter(oldObj.getClass(), propertyData);
             } else {
                 return false;
             }
 
-            ret |= properties.get(propertyName).mapToMapFromEntity(data,
+            ret |= properties.get(propertyData).mapToMapFromEntity(data,
                     newObj == null ? null : getter.get(newObj),
                     oldObj == null ? null : getter.get(oldObj));
         }
@@ -105,9 +110,10 @@
         return ret;
     }
 
-    public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey, AuditReaderImplementor versionsReader, Number revision) {
-        for (String propertyName : properties.keySet()) {
-            properties.get(propertyName).mapToEntityFromMap(verCfg, obj, data, primaryKey, versionsReader, revision);
+    public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
+                                   AuditReaderImplementor versionsReader, Number revision) {
+        for (PropertyMapper mapper : properties.values()) {
+            mapper.mapToEntityFromMap(verCfg, obj, data, primaryKey, versionsReader, revision);
         }
     }
 
@@ -115,7 +121,7 @@
                                                                                     PersistentCollection newColl,
                                                                                     Serializable oldColl,
                                                                                     Serializable id) {
-        PropertyMapper mapper = properties.get(referencingPropertyName);
+        PropertyMapper mapper = properties.get(propertyDatas.get(referencingPropertyName));
         if (mapper != null) {
             return mapper.mapCollectionChanges(referencingPropertyName, newColl, oldColl, id);
         } else {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SimpleMapperBuilder.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SimpleMapperBuilder.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SimpleMapperBuilder.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -23,11 +23,11 @@
  */
 package org.hibernate.envers.entities.mapper;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 
 /**
  * @author Adam Warski (adam at warski dot org)
  */
 public interface SimpleMapperBuilder {    
-    public void add(String propertyName, ModificationStore modStore);
+    public void add(PropertyData propertyData);
 }
\ No newline at end of file

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SinglePropertyMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -27,7 +27,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.reader.AuditReaderImplementor;
@@ -42,37 +42,38 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public class SinglePropertyMapper implements PropertyMapper, SimpleMapperBuilder {
-    private String propertyName;
+    private PropertyData propertyData;
 
     public SinglePropertyMapper() { }
 
-    public void add(String propertyName, ModificationStore modStore) {
-        if (this.propertyName != null) {
+    public void add(PropertyData propertyData) {
+        if (this.propertyData != null) {
             throw new AuditException("Only one property can be added!");
         }
 
-        this.propertyName = propertyName;
+        this.propertyData = propertyData;
     }
 
     public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
-        data.put(propertyName, newObj);
+        data.put(propertyData.getName(), newObj);
 
         return !Tools.objectsEqual(newObj, oldObj);
     }
 
-    public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey, AuditReaderImplementor versionsReader, Number revision) {
+    public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
+                                   AuditReaderImplementor versionsReader, Number revision) {
         if (data == null || obj == null) {
             return;
         }
 
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName);
-        setter.set(obj, data.get(propertyName), null);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
+        setter.set(obj, data.get(propertyData.getName()), null);
     }
 
     public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
-                                                                                    PersistentCollection newColl,
-                                                                                    Serializable oldColl,
-                                                                                    Serializable id) {
+                                                                     PersistentCollection newColl,
+                                                                     Serializable oldColl,
+                                                                     Serializable id) {
         return null;
     }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SubclassPropertyMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SubclassPropertyMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/SubclassPropertyMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -27,7 +27,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 
@@ -80,15 +80,15 @@
         }
     }
 
-    public CompositeMapperBuilder addComposite(String propertyName) {
-        return main.addComposite(propertyName);
+    public CompositeMapperBuilder addComposite(PropertyData propertyData) {
+        return main.addComposite(propertyData);
     }
 
-    public void addComposite(String propertyName, PropertyMapper propertyMapper) {
-        main.addComposite(propertyName, propertyMapper);
+    public void addComposite(PropertyData propertyData, PropertyMapper propertyMapper) {
+        main.addComposite(propertyData, propertyMapper);
     }
 
-    public void add(String propertyName, ModificationStore modStore) {
-        main.add(propertyName, modStore);
+    public void add(PropertyData propertyData) {
+        main.add(propertyData);
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/AbstractCompositeIdMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/AbstractCompositeIdMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/AbstractCompositeIdMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -23,27 +23,27 @@
  */
 package org.hibernate.envers.entities.mapper.id;
 
-import java.util.LinkedHashMap;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.exception.AuditException;
+import org.hibernate.envers.tools.Tools;
 
 /**
  * @author Adam Warski (adam at warski dot org)
  */
 public abstract class AbstractCompositeIdMapper extends AbstractIdMapper implements SimpleIdMapperBuilder {
-    protected Map<String, SingleIdMapper> ids;
+    protected Map<PropertyData, SingleIdMapper> ids;
     protected String compositeIdClass;
 
     protected AbstractCompositeIdMapper(String compositeIdClass) {
-        ids = new LinkedHashMap<String, SingleIdMapper>();
+        ids = Tools.newLinkedHashMap();
         
         this.compositeIdClass = compositeIdClass;
     }
 
-    public void add(String propertyName, ModificationStore modStore) {
-        ids.put(propertyName, new SingleIdMapper(propertyName));
+    public void add(PropertyData propertyData) {
+        ids.put(propertyData, new SingleIdMapper(propertyData));
     }
 
     public Object mapToIdFromMap(Map data) {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/EmbeddedIdMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/EmbeddedIdMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/EmbeddedIdMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -30,6 +30,7 @@
 
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
+import org.hibernate.envers.entities.PropertyData;
 
 import org.hibernate.property.Getter;
 import org.hibernate.property.Setter;
@@ -39,12 +40,12 @@
  * @author Adam Warski (adam at warski dot org)
  */
 public class EmbeddedIdMapper extends AbstractCompositeIdMapper implements SimpleIdMapperBuilder {
-    private String idPropertyName;
+    private PropertyData idPropertyData;
 
-    public EmbeddedIdMapper(String idPropertyName, String compositeIdClass) {
+    public EmbeddedIdMapper(PropertyData idPropertyData, String compositeIdClass) {
         super(compositeIdClass);
         
-        this.idPropertyName = idPropertyName;
+        this.idPropertyData = idPropertyData;
     }
 
     public void mapToMapFromId(Map<String, Object> data, Object obj) {
@@ -58,7 +59,7 @@
             return;
         }
 
-        Getter getter = ReflectionTools.getGetter(obj.getClass(), idPropertyName);
+        Getter getter = ReflectionTools.getGetter(obj.getClass(), idPropertyData);
         mapToMapFromId(data, getter.get(obj));
     }
 
@@ -67,8 +68,8 @@
             return;
         }
 
-        Getter getter = ReflectionTools.getGetter(obj.getClass(), idPropertyName);
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), idPropertyName);
+        Getter getter = ReflectionTools.getGetter(obj.getClass(), idPropertyData);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), idPropertyData);
 
         try {
             Object subObj = ReflectHelper.getDefaultConstructor(getter.getReturnType()).newInstance();
@@ -83,10 +84,12 @@
     }
 
     public IdMapper prefixMappedProperties(String prefix) {
-        EmbeddedIdMapper ret = new EmbeddedIdMapper(idPropertyName, compositeIdClass);
+        EmbeddedIdMapper ret = new EmbeddedIdMapper(idPropertyData, compositeIdClass);
 
-        for (String propertyName : ids.keySet()) {
-            ret.ids.put(propertyName, new SingleIdMapper(propertyName, prefix + propertyName));
+        for (PropertyData propertyData : ids.keySet()) {
+            String propertyName = propertyData.getName();
+            ret.ids.put(propertyData, new SingleIdMapper(propertyName,
+                    new PropertyData(prefix + propertyName, propertyData)));
         }
 
         return ret;
@@ -97,7 +100,7 @@
             return null;
         }
 
-        Getter getter = ReflectionTools.getGetter(data.getClass(), idPropertyName);
+        Getter getter = ReflectionTools.getGetter(data.getClass(), idPropertyData);
         return getter.get(data);
     }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/MultipleIdMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/MultipleIdMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/MultipleIdMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -29,6 +29,7 @@
 import java.util.Map;
 
 import org.hibernate.envers.exception.AuditException;
+import org.hibernate.envers.entities.PropertyData;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -57,8 +58,10 @@
     public IdMapper prefixMappedProperties(String prefix) {
         MultipleIdMapper ret = new MultipleIdMapper(compositeIdClass);
 
-        for (String propertyName : ids.keySet()) {
-            ret.ids.put(propertyName, new SingleIdMapper(propertyName, prefix + propertyName));
+        for (PropertyData propertyData : ids.keySet()) {
+            String propertyName = propertyData.getName();
+            ret.ids.put(propertyData, new SingleIdMapper(propertyName,
+                    new PropertyData(prefix + propertyName, propertyData)));
         }
 
         return ret;

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/SingleIdMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/SingleIdMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/id/SingleIdMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -27,7 +27,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.hibernate.envers.ModificationStore;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
 
@@ -39,28 +39,28 @@
  */
 public class SingleIdMapper extends AbstractIdMapper implements SimpleIdMapperBuilder {
     private String beanPropertyName;
-    private String propertyName;
+    private PropertyData propertyData;
 
     public SingleIdMapper() {
     }
 
-    public SingleIdMapper(String beanPropertyName, String propertyName) {
+    public SingleIdMapper(String beanPropertyName, PropertyData propertyData) {
         this.beanPropertyName = beanPropertyName;
-        this.propertyName = propertyName;
+        this.propertyData = propertyData;
     }
 
-    public SingleIdMapper(String propertyName) {
-        this.beanPropertyName = propertyName;
-        this.propertyName = propertyName;
+    public SingleIdMapper(PropertyData propertyData) {
+        this.beanPropertyName = propertyData.getName();
+        this.propertyData = propertyData;
     }
 
-    public void add(String propertyName, ModificationStore modStore) {
-        if (this.propertyName != null) {
+    public void add(PropertyData propertyData) {
+        if (this.propertyData != null) {
             throw new AuditException("Only one property can be added!");
         }
 
-        this.propertyName = propertyName;
-        this.beanPropertyName = propertyName;
+        this.propertyData = propertyData;
+        this.beanPropertyName = propertyData.getName();
     }
 
     public void mapToEntityFromMap(Object obj, Map data) {
@@ -68,8 +68,8 @@
             return;
         }
 
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), beanPropertyName);
-        setter.set(obj, data.get(propertyName), null);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), beanPropertyName, propertyData.getAccessType());
+        setter.set(obj, data.get(propertyData.getName()), null);
     }
 
     public Object mapToIdFromMap(Map data) {
@@ -77,7 +77,7 @@
             return null;
         }
 
-        return data.get(propertyName);
+        return data.get(propertyData.getName());
     }
 
     public Object mapToIdFromEntity(Object data) {
@@ -85,22 +85,22 @@
             return null;
         }
 
-        Getter getter = ReflectionTools.getGetter(data.getClass(), beanPropertyName);
+        Getter getter = ReflectionTools.getGetter(data.getClass(), beanPropertyName, propertyData.getAccessType());
         return getter.get(data);
     }
 
     public void mapToMapFromId(Map<String, Object> data, Object obj) {
         if (data != null) {
-            data.put(propertyName, obj);
+            data.put(propertyData.getName(), obj);
         }
     }
 
     public void mapToMapFromEntity(Map<String, Object> data, Object obj) {
         if (obj == null) {
-            data.put(propertyName, null);
+            data.put(propertyData.getName(), null);
         } else {
-            Getter getter = ReflectionTools.getGetter(obj.getClass(), beanPropertyName);
-            data.put(propertyName, getter.get(obj));
+            Getter getter = ReflectionTools.getGetter(obj.getClass(), beanPropertyName, propertyData.getAccessType());
+            data.put(propertyData.getName(), getter.get(obj));
         }
     }
 
@@ -109,19 +109,20 @@
             return;
         }
 
-        Getter getter = ReflectionTools.getGetter(objFrom.getClass(), beanPropertyName);
-        Setter setter = ReflectionTools.getSetter(objTo.getClass(), beanPropertyName);
+        Getter getter = ReflectionTools.getGetter(objFrom.getClass(), beanPropertyName, propertyData.getAccessType());
+        Setter setter = ReflectionTools.getSetter(objTo.getClass(), beanPropertyName, propertyData.getAccessType());
         setter.set(objTo, getter.get(objFrom), null);
     }
 
     public IdMapper prefixMappedProperties(String prefix) {
-        return new SingleIdMapper(propertyName, prefix + propertyName);
+        return new SingleIdMapper(propertyData.getName(),
+                new PropertyData(prefix + propertyData.getName(), propertyData));
     }
 
     public List<QueryParameterData> mapToQueryParametersFromId(Object obj) {
         List<QueryParameterData> ret = new ArrayList<QueryParameterData>();
 
-        ret.add(new QueryParameterData(propertyName, obj));
+        ret.add(new QueryParameterData(propertyData.getName(), obj));
 
         return ret;
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/AbstractCollectionMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -101,7 +101,8 @@
     public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
                                                                      PersistentCollection newColl,
                                                                      Serializable oldColl, Serializable id) {
-        if (!commonCollectionMapperData.getCollectionReferencingPropertyName().equals(referencingPropertyName)) {
+        if (!commonCollectionMapperData.getCollectionReferencingPropertyData().getName()
+                .equals(referencingPropertyName)) {
             return null;
         }
 
@@ -138,7 +139,7 @@
     public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
                                    AuditReaderImplementor versionsReader, Number revision) {
         Setter setter = ReflectionTools.getSetter(obj.getClass(),
-                commonCollectionMapperData.getCollectionReferencingPropertyName());
+                commonCollectionMapperData.getCollectionReferencingPropertyData());
         try {
             setter.set(obj, proxyConstructor.newInstance(getInitializor(verCfg, versionsReader, primaryKey, revision)), null);
         } catch (InstantiationException e) {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/CommonCollectionMapperData.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/CommonCollectionMapperData.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/CommonCollectionMapperData.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -25,6 +25,7 @@
 
 import org.hibernate.envers.configuration.AuditEntitiesConfiguration;
 import org.hibernate.envers.entities.mapper.relation.query.RelationQueryGenerator;
+import org.hibernate.envers.entities.PropertyData;
 
 /**
  * Data that is used by all collection mappers, regardless of the type.  
@@ -33,16 +34,16 @@
 public final class CommonCollectionMapperData {
     private final AuditEntitiesConfiguration verEntCfg;
     private final String versionsMiddleEntityName;
-    private final String collectionReferencingPropertyName;
+    private final PropertyData collectionReferencingPropertyData;
     private final MiddleIdData referencingIdData;
     private final RelationQueryGenerator queryGenerator;
 
     public CommonCollectionMapperData(AuditEntitiesConfiguration verEntCfg, String versionsMiddleEntityName,
-                                      String collectionReferencingPropertyName, MiddleIdData referencingIdData,
+                                      PropertyData collectionReferencingPropertyData, MiddleIdData referencingIdData,
                                       RelationQueryGenerator queryGenerator) {
         this.verEntCfg = verEntCfg;
         this.versionsMiddleEntityName = versionsMiddleEntityName;
-        this.collectionReferencingPropertyName = collectionReferencingPropertyName;
+        this.collectionReferencingPropertyData = collectionReferencingPropertyData;
         this.referencingIdData = referencingIdData;
         this.queryGenerator = queryGenerator;
     }
@@ -55,8 +56,8 @@
         return versionsMiddleEntityName;
     }
 
-    public String getCollectionReferencingPropertyName() {
-        return collectionReferencingPropertyName;
+    public PropertyData getCollectionReferencingPropertyData() {
+        return collectionReferencingPropertyData;
     }
 
     public MiddleIdData getReferencingIdData() {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -31,6 +31,7 @@
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData;
 import org.hibernate.envers.entities.mapper.PropertyMapper;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.query.AuditRestrictions;
 import org.hibernate.envers.reader.AuditReaderImplementor;
@@ -46,12 +47,13 @@
 public class OneToOneNotOwningMapper implements PropertyMapper {
     private String owningReferencePropertyName;
     private String owningEntityName;
-    private String propertyName;
+    private PropertyData propertyData;
 
-    public OneToOneNotOwningMapper(String owningReferencePropertyName, String owningEntityName, String propertyName) {
+    public OneToOneNotOwningMapper(String owningReferencePropertyName, String owningEntityName,
+                                   PropertyData propertyData) {
         this.owningReferencePropertyName = owningReferencePropertyName;
         this.owningEntityName = owningEntityName;
-        this.propertyName = propertyName;
+        this.propertyData = propertyData;
     }
 
     public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
@@ -77,7 +79,7 @@
                     ", " + owningReferencePropertyName + ")");
         }
 
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
         setter.set(obj, value, null);
     }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -33,6 +33,7 @@
 import org.hibernate.envers.entities.mapper.PropertyMapper;
 import org.hibernate.envers.entities.mapper.id.IdMapper;
 import org.hibernate.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 import org.hibernate.envers.tools.Tools;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
@@ -45,18 +46,18 @@
  */
 public class ToOneIdMapper implements PropertyMapper {
     private final IdMapper delegate;
-    private final String propertyName;
+    private final PropertyData propertyData;
     private final String referencedEntityName;
 
-    public ToOneIdMapper(IdMapper delegate, String propertyName, String referencedEntityName) {
+    public ToOneIdMapper(IdMapper delegate, PropertyData propertyData, String referencedEntityName) {
         this.delegate = delegate;
-        this.propertyName = propertyName;
+        this.propertyData = propertyData;
         this.referencedEntityName = referencedEntityName;
     }
 
     public boolean mapToMapFromEntity(Map<String, Object> data, Object newObj, Object oldObj) {
         HashMap<String, Object> newData = new HashMap<String, Object>();
-        data.put(propertyName, newData);
+        data.put(propertyData.getName(), newData);
 
         delegate.mapToMapFromEntity(newData, newObj);
 
@@ -69,7 +70,7 @@
             return;
         }
 
-        Object entityId = delegate.mapToIdFromMap((Map) data.get(propertyName));
+        Object entityId = delegate.mapToIdFromMap((Map) data.get(propertyData.getName()));
         Object value;
         if (entityId == null) {
             value = null;
@@ -84,7 +85,7 @@
             }
         }
 
-        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyName);
+        Setter setter = ReflectionTools.getSetter(obj.getClass(), propertyData);
         setter.set(obj, value, null);
     }
 

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/component/MiddleMapKeyPropertyComponentMapper.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/component/MiddleMapKeyPropertyComponentMapper.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/entities/mapper/relation/component/MiddleMapKeyPropertyComponentMapper.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -35,17 +35,19 @@
  * so <code>mapToMapFromObject</code> is empty.
  * @author Adam Warski (adam at warski dot org)
  */
-public final class MiddleMapKeyPropertyComponentMapper implements MiddleComponentMapper {
+public class MiddleMapKeyPropertyComponentMapper implements MiddleComponentMapper {
     private final String propertyName;
+    private final String accessType;
 
-    public MiddleMapKeyPropertyComponentMapper(String propertyName) {
+    public MiddleMapKeyPropertyComponentMapper(String propertyName, String accessType) {
         this.propertyName = propertyName;
+        this.accessType = accessType;
     }
 
     public Object mapToObjectFromFullMap(EntityInstantiator entityInstantiator, Map<String, Object> data,
                                          Object dataObject, Number revision) {
         // dataObject is not null, as this mapper can only be used in an index.
-        return ReflectionTools.getGetter(dataObject.getClass(), propertyName).get(dataObject);
+        return ReflectionTools.getGetter(dataObject.getClass(), propertyName, accessType).get(dataObject);
     }
 
     public void mapToMapFromObject(Map<String, Object> data, Object obj) {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionProperty.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -124,6 +124,6 @@
     }
 
     public Triple<String, String, Boolean> getData(AuditConfiguration verCfg) {
-        return Triple.make(null, verCfg.getVerEntCfg().getRevisionPropPath(), false);
+        return Triple.make(null, verCfg.getAuditEntCfg().getRevisionPropPath(), false);
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/RevisionTypeProperty.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -42,6 +42,6 @@
     }
 
     public Triple<String, String, Boolean> getData(AuditConfiguration verCfg) {
-        return Triple.make(null, verCfg.getVerEntCfg().getRevisionTypePropName(), false);
+        return Triple.make(null, verCfg.getAuditEntCfg().getRevisionTypePropName(), false);
     }
 }
\ No newline at end of file

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqVersionsExpression.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqVersionsExpression.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/IdentifierEqVersionsExpression.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -39,6 +39,6 @@
 
     public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
         verCfg.getEntCfg().get(entityName).getIdMapper()
-                .addIdEqualsToQuery(parameters, id, verCfg.getVerEntCfg().getOriginalIdPropName(), true);
+                .addIdEqualsToQuery(parameters, id, verCfg.getAuditEntCfg().getOriginalIdPropName(), true);
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionVersionsExpression.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionVersionsExpression.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/criteria/RevisionVersionsExpression.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -40,6 +40,6 @@
     }
 
     public void addToQuery(AuditConfiguration verCfg, String entityName, QueryBuilder qb, Parameters parameters) {
-        parameters.addWhereWithParam(verCfg.getVerEntCfg().getRevisionPropPath(), op, value);
+        parameters.addWhereWithParam(verCfg.getAuditEntCfg().getRevisionPropPath(), op, value);
     }
 }
\ No newline at end of file

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/AbstractVersionsQuery.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/AbstractVersionsQuery.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/AbstractVersionsQuery.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -73,7 +73,7 @@
         entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
 
         entityName = cls.getName();
-        versionsEntityName = verCfg.getVerEntCfg().getVersionsEntityName(entityName);
+        versionsEntityName = verCfg.getAuditEntCfg().getVersionsEntityName(entityName);
 
         qb = new QueryBuilder(versionsEntityName, "e");
     }
@@ -84,8 +84,6 @@
 
         qb.build(querySb, queryParamValues);
 
-        System.out.println("QUERY: " + querySb.toString());
-
         Query query = versionsReader.getSession().createQuery(querySb.toString());
         for (Map.Entry<String, Object> paramValue : queryParamValues.entrySet()) {
             query.setParameter(paramValue.getKey(), paramValue.getValue());

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -59,7 +59,7 @@
 
         QueryBuilder maxRevQb = qb.newSubQueryBuilder(versionsEntityName, "e2");
 
-        AuditEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg();
+        AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
 
         String revisionPropertyPath = verEntCfg.getRevisionPropPath();
         String originalIdPropertyName = verEntCfg.getOriginalIdPropName();

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -54,7 +54,7 @@
     }
 
     private Number getRevisionNumber(Map versionsEntity) {
-        AuditEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg();
+        AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
 
         String originalId = verEntCfg.getOriginalIdPropName();
         String revisionPropertyName = verEntCfg.getRevisionPropName();
@@ -71,7 +71,7 @@
 
     @SuppressWarnings({"unchecked"})
     public List list() throws AuditException {
-        AuditEntitiesConfiguration verEntCfg = verCfg.getVerEntCfg();
+        AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
 
         /*
         The query that should be executed in the versions table:
@@ -97,8 +97,8 @@
         }
 
         if (!selectEntitiesOnly) {
-            qb.addFrom(verCfg.getVerEntCfg().getRevisionInfoEntityName(), "r");
-            qb.getRootParameters().addWhere(verCfg.getVerEntCfg().getRevisionPropPath(), true, "=", "r.id", false);
+            qb.addFrom(verCfg.getAuditEntCfg().getRevisionInfoEntityName(), "r");
+            qb.getRootParameters().addWhere(verCfg.getAuditEntCfg().getRevisionPropPath(), true, "=", "r.id", false);
         }
 
         List<Object> queryResult = buildAndExecuteQuery();

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/order/RevisionVersionsOrder.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/order/RevisionVersionsOrder.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/order/RevisionVersionsOrder.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -37,7 +37,7 @@
     }
 
     public Pair<String, Boolean> getData(AuditConfiguration verCfg) {
-        String revisionPropPath = verCfg.getVerEntCfg().getRevisionPropPath();
+        String revisionPropPath = verCfg.getAuditEntCfg().getRevisionPropPath();
         return Pair.make(revisionPropPath, asc);
     }
 }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/query/projection/RevisionVersionsProjection.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/query/projection/RevisionVersionsProjection.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/query/projection/RevisionVersionsProjection.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -45,7 +45,7 @@
     }
 
     public Triple<String, String, Boolean> getData(AuditConfiguration verCfg) {
-        String revisionPropPath = verCfg.getVerEntCfg().getRevisionPropPath();
+        String revisionPropPath = verCfg.getAuditEntCfg().getRevisionPropPath();
 
         switch (type) {
             case MAX: return Triple.make("max", revisionPropPath, false);

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/DefaultRevisionInfoGenerator.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -24,6 +24,7 @@
 package org.hibernate.envers.revisioninfo;
 
 import org.hibernate.envers.RevisionListener;
+import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
 
 import org.hibernate.MappingException;
@@ -41,11 +42,11 @@
 
     public DefaultRevisionInfoGenerator(String revisionInfoEntityName, Class<?> revisionInfoClass,
                                        Class<? extends RevisionListener> listenerClass,
-                                       String revisionInfoTimestampName) {
+                                       PropertyData revisionInfoTimestampData) {
         this.revisionInfoEntityName = revisionInfoEntityName;
         this.revisionInfoClass = revisionInfoClass;
 
-        revisionTimestampSetter = ReflectionTools.getSetter(revisionInfoClass, revisionInfoTimestampName);
+        revisionTimestampSetter = ReflectionTools.getSetter(revisionInfoClass, revisionInfoTimestampData);
 
         if (!listenerClass.equals(RevisionListener.class)) {
             // This is not the default value.

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoNumberReader.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoNumberReader.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/revisioninfo/RevisionInfoNumberReader.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -24,6 +24,7 @@
 package org.hibernate.envers.revisioninfo;
 
 import org.hibernate.envers.tools.reflection.ReflectionTools;
+import org.hibernate.envers.entities.PropertyData;
 
 import org.hibernate.property.Getter;
 
@@ -33,8 +34,8 @@
  */
 public class RevisionInfoNumberReader {
     private final Getter revisionIdGetter;
-    public RevisionInfoNumberReader(Class<?> revisionInfoClass, String revisionInfoIdName) {
-        revisionIdGetter = ReflectionTools.getGetter(revisionInfoClass, revisionInfoIdName);
+    public RevisionInfoNumberReader(Class<?> revisionInfoClass, PropertyData revisionInfoIdData) {
+        revisionIdGetter = ReflectionTools.getGetter(revisionInfoClass, revisionInfoIdData);
     }
 
     public Number getRevisionNumber(Object revision) {

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AbstractAuditWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -51,7 +51,7 @@
     }
 
     protected void fillDataWithId(Map<String, Object> data, Object revision, RevisionType revisionType) {
-        AuditEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg();
+        AuditEntitiesConfiguration entitiesCfg = verCfg.getAuditEntCfg();
 
         Map<String, Object> originalId = new HashMap<String, Object>();
         originalId.put(entitiesCfg.getRevisionPropName(), revision);
@@ -79,7 +79,7 @@
 
     public void undo(Session session) {
         if (isPerformed()) {
-            session.delete(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), performedData);
+            session.delete(verCfg.getAuditEntCfg().getVersionsEntityName(getEntityName()), performedData);
             session.flush();
         }
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AddWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AddWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/AddWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -58,7 +58,7 @@
 
         verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().map(data, propertyNames, state, null);
 
-        session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data);
+        session.save(verCfg.getAuditEntCfg().getVersionsEntityName(getEntityName()), data);
 
         setPerformed(data);
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/CollectionChangeWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/CollectionChangeWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/CollectionChangeWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -54,7 +54,7 @@
 
         verCfg.getEntCfg().get(getEntityName()).getPropertyMapper().mapToMapFromEntity(data, entity, null);
 
-        session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data);
+        session.save(verCfg.getAuditEntCfg().getVersionsEntityName(getEntityName()), data);
 
         setPerformed(data);
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/DelWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/DelWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/DelWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -48,7 +48,7 @@
         Map<String, Object> data = new HashMap<String, Object>();
         fillDataWithId(data, revisionData, RevisionType.DEL);
 
-        session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data);
+        session.save(verCfg.getAuditEntCfg().getVersionsEntityName(getEntityName()), data);
 
         setPerformed(data);
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/ModWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/ModWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/ModWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -56,7 +56,7 @@
     public void perform(Session session, Object revisionData) {
         fillDataWithId(data, revisionData, RevisionType.MOD);
 
-        session.save(verCfg.getVerEntCfg().getVersionsEntityName(getEntityName()), data);
+        session.save(verCfg.getAuditEntCfg().getVersionsEntityName(getEntityName()), data);
 
         setPerformed(data);
     }

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/synchronization/work/PersistentCollectionChangeWorkUnit.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -58,7 +58,7 @@
 
     @SuppressWarnings({"unchecked"})
     public void perform(Session session, Object revisionData) {
-        AuditEntitiesConfiguration entitiesCfg = verCfg.getVerEntCfg();
+        AuditEntitiesConfiguration entitiesCfg = verCfg.getAuditEntCfg();
 
         for (PersistentCollectionChangeData persistentCollectionChangeData : collectionChanges) {
             // Setting the revision number

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/tools/Tools.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -23,11 +23,7 @@
  */
 package org.hibernate.envers.tools;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -37,6 +33,14 @@
         return new HashMap<K,V>();
     }
 
+    public static <E> Set<E> newHashSet() {
+        return new HashSet<E>();
+    }
+
+    public static <K,V> Map<K,V> newLinkedHashMap() {
+        return new LinkedHashMap<K,V>();
+    }
+
     public static boolean objectsEqual(Object obj1, Object obj2) {
         if (obj1 == null) {
             return obj2 == null;

Modified: core/trunk/envers/src/main/java/org/hibernate/envers/tools/reflection/ReflectionTools.java
===================================================================
--- core/trunk/envers/src/main/java/org/hibernate/envers/tools/reflection/ReflectionTools.java	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/main/java/org/hibernate/envers/tools/reflection/ReflectionTools.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -29,12 +29,9 @@
 import org.hibernate.envers.tools.ConcurrentReferenceHashMap;
 import org.hibernate.envers.tools.Pair;
 import static org.hibernate.envers.tools.Pair.make;
+import org.hibernate.envers.entities.PropertyData;
 
-import org.hibernate.property.BasicPropertyAccessor;
-import org.hibernate.property.Getter;
-import org.hibernate.property.PropertyAccessor;
-import org.hibernate.property.Setter;
-import org.hibernate.util.ReflectHelper;
+import org.hibernate.property.*;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -49,8 +46,6 @@
                 ConcurrentReferenceHashMap.ReferenceType.SOFT,
                 ConcurrentReferenceHashMap.ReferenceType.SOFT);
 
-    private static final PropertyAccessor BASIC_PROPERTY_ACCESSOR = new BasicPropertyAccessor();
-
     public static Class<?> loadClass(String name) {
         try {
             return Thread.currentThread().getContextClassLoader().loadClass(name);
@@ -59,11 +54,19 @@
         }
     }
 
-    public static Getter getGetter(Class cls, String propertyName) {
+    private static PropertyAccessor getAccessor(String accessorType) {
+        return PropertyAccessorFactory.getPropertyAccessor(accessorType);
+    }
+
+    public static Getter getGetter(Class cls, PropertyData propertyData) {
+        return getGetter(cls, propertyData.getName(), propertyData.getAccessType());
+    }
+
+    public static Getter getGetter(Class cls, String propertyName, String accessorType) {
         Pair<Class, String> key = make(cls, propertyName);
         Getter value = getterCache.get(key);
         if (value == null) {
-            value = ReflectHelper.getGetter(cls, propertyName);
+            value = getAccessor(accessorType).getGetter(cls, propertyName);
             // It's ok if two getters are generated concurrently
             getterCache.put(key, value);
         }
@@ -71,11 +74,15 @@
         return value;
     }
 
-    public static Setter getSetter(Class cls, String propertyName) {
+    public static Setter getSetter(Class cls, PropertyData propertyData) {
+        return getSetter(cls, propertyData.getName(), propertyData.getAccessType());
+    }
+
+    public static Setter getSetter(Class cls, String propertyName, String accessorType) {
         Pair<Class, String> key = make(cls, propertyName);
         Setter value = setterCache.get(key);
         if (value == null) {
-            value = BASIC_PROPERTY_ACCESSOR.getSetter(cls, propertyName);
+            value = getAccessor(accessorType).getSetter(cls, propertyName);
             // It's ok if two setters are generated concurrently
             setterCache.put(key, value);
         }

Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessType.java (from rev 15478, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/data/Dates.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessType.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessType.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,74 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.accesstype;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class FieldAccessType extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(FieldAccessTypeEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        FieldAccessTypeEntity fate = new FieldAccessTypeEntity("data");
+        em.persist(fate);
+        id1 = fate.readId();
+        em.getTransaction().commit();
+
+        em.getTransaction().begin();
+        fate = em.find(FieldAccessTypeEntity.class, id1);
+        fate.writeData("data2");
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(FieldAccessTypeEntity.class, id1));
+    }
+
+    @Test
+    public void testHistoryOfId1() {
+        FieldAccessTypeEntity ver1 = new FieldAccessTypeEntity(id1, "data");
+        FieldAccessTypeEntity ver2 = new FieldAccessTypeEntity(id1, "data2");
+
+        assert getVersionsReader().find(FieldAccessTypeEntity.class, id1, 1).equals(ver1);
+        assert getVersionsReader().find(FieldAccessTypeEntity.class, id1, 2).equals(ver2);
+    }
+}
\ No newline at end of file


Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessType.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Copied: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessTypeEntity.java (from rev 15478, core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/data/DateTestEntity.java)
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessTypeEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessTypeEntity.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,99 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.accesstype;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class FieldAccessTypeEntity {
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Audited
+    private String data;
+
+    public FieldAccessTypeEntity() {
+    }
+
+    public FieldAccessTypeEntity(String data) {
+        this.data = data;
+    }
+
+    public FieldAccessTypeEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public Integer getId() {
+        throw new RuntimeException();
+    }
+
+    public void setId(Integer id) {
+        throw new RuntimeException();
+    }
+
+    public String getData() {
+        throw new RuntimeException();
+    }
+
+    public void setData(String data) {
+        throw new RuntimeException();
+    }
+
+    public Integer readId() {
+        return id;
+    }
+
+    public void writeData(String data) {
+        this.data = data;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof FieldAccessTypeEntity)) return false;
+
+        FieldAccessTypeEntity that = (FieldAccessTypeEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+}
\ No newline at end of file


Property changes on: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/FieldAccessTypeEntity.java
___________________________________________________________________
Name: svn:mergeinfo
   + 

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessType.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,79 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.integration.accesstype;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class MixedAccessType extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(MixedAccessTypeEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        MixedAccessTypeEntity mate = new MixedAccessTypeEntity("data");
+        em.persist(mate);
+        id1 = mate.readId();
+        em.getTransaction().commit();
+
+        em.getTransaction().begin();
+        mate = em.find(MixedAccessTypeEntity.class, id1);
+        mate.writeData("data2");
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(MixedAccessTypeEntity.class, id1));
+    }
+
+    @Test
+    public void testHistoryOfId1() {
+        MixedAccessTypeEntity ver1 = new MixedAccessTypeEntity(id1, "data");
+        MixedAccessTypeEntity ver2 = new MixedAccessTypeEntity(id1, "data2");
+
+        MixedAccessTypeEntity rev1 = getVersionsReader().find(MixedAccessTypeEntity.class, id1, 1);
+        MixedAccessTypeEntity rev2 = getVersionsReader().find(MixedAccessTypeEntity.class, id1, 2);
+
+        assert rev1.isDataSet();
+        assert rev2.isDataSet();
+
+        assert rev1.equals(ver1);
+        assert rev2.equals(ver2);
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessTypeEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessTypeEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/MixedAccessTypeEntity.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,111 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.integration.accesstype;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class MixedAccessTypeEntity {
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @AccessType("property")
+    private String data;
+
+    @Transient
+    private boolean dataSet;
+
+    public MixedAccessTypeEntity() {
+    }
+
+    public MixedAccessTypeEntity(String data) {
+        this.data = data;
+    }
+
+    public MixedAccessTypeEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    public Integer getId() {
+        throw new RuntimeException();
+    }
+
+    public void setId(Integer id) {
+        throw new RuntimeException();
+    }
+
+    // TODO: this should be on the property. But how to discover in AnnotationsMetadataReader that the
+    // we should read annotations from fields, even though the access type is "property"?
+    @Audited
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+        dataSet = true;
+    }
+
+    public boolean isDataSet() {
+        return dataSet;
+    }
+
+    public Integer readId() {
+        return id;
+    }
+
+    public void writeData(String data) {
+        this.data = data;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof MixedAccessTypeEntity)) return false;
+
+        MixedAccessTypeEntity that = (MixedAccessTypeEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessType.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessType.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessType.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,82 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.envers.test.integration.accesstype;
+
+import java.util.Arrays;
+import javax.persistence.EntityManager;
+
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import org.hibernate.ejb.Ejb3Configuration;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class PropertyAccessType extends AbstractEntityTest {
+    private Integer id1;
+
+    public void configure(Ejb3Configuration cfg) {
+        cfg.addAnnotatedClass(PropertyAccessTypeEntity.class);
+    }
+
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+        EntityManager em = getEntityManager();
+        em.getTransaction().begin();
+        PropertyAccessTypeEntity pate = new PropertyAccessTypeEntity("data");
+        em.persist(pate);
+        id1 = pate.getId();
+        em.getTransaction().commit();
+
+        em.getTransaction().begin();
+        pate = em.find(PropertyAccessTypeEntity.class, id1);
+        pate.writeData("data2");
+        em.getTransaction().commit();
+    }
+
+    @Test
+    public void testRevisionsCounts() {
+        assert Arrays.asList(1, 2).equals(getVersionsReader().getRevisions(PropertyAccessTypeEntity.class, id1));
+    }
+
+    @Test
+    public void testHistoryOfId1() {
+        PropertyAccessTypeEntity ver1 = new PropertyAccessTypeEntity(id1, "data");
+        PropertyAccessTypeEntity ver2 = new PropertyAccessTypeEntity(id1, "data2");
+
+        PropertyAccessTypeEntity rev1 = getVersionsReader().find(PropertyAccessTypeEntity.class, id1, 1);
+        PropertyAccessTypeEntity rev2 = getVersionsReader().find(PropertyAccessTypeEntity.class, id1, 2);
+
+        assert rev1.isIdSet();
+        assert rev2.isIdSet();
+
+        assert rev1.isDataSet();
+        assert rev2.isDataSet();
+
+        assert rev1.equals(ver1);
+        assert rev2.equals(ver2);
+    }
+}
\ No newline at end of file

Added: core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessTypeEntity.java
===================================================================
--- core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessTypeEntity.java	                        (rev 0)
+++ core/trunk/envers/src/test/java/org/hibernate/envers/test/integration/accesstype/PropertyAccessTypeEntity.java	2008-11-03 11:24:30 UTC (rev 15481)
@@ -0,0 +1,110 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+
+package org.hibernate.envers.test.integration.accesstype;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+ at Entity
+public class PropertyAccessTypeEntity {
+    private Integer id;
+    private String data;
+
+    private boolean idSet;
+    private boolean dataSet;
+
+    public PropertyAccessTypeEntity() {
+    }
+
+    public PropertyAccessTypeEntity(String data) {
+        this.data = data;
+    }
+
+    public PropertyAccessTypeEntity(Integer id, String data) {
+        this.id = id;
+        this.data = data;
+    }
+
+    @Id
+    @GeneratedValue
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+        idSet = true;
+    }
+
+    @Audited
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+        dataSet = true;
+    }
+
+    @Transient
+    public boolean isIdSet() {
+        return idSet;
+    }
+
+    @Transient
+    public boolean isDataSet() {
+        return dataSet;
+    }
+
+    public void writeData(String data) {
+        this.data = data;
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof PropertyAccessTypeEntity)) return false;
+
+        PropertyAccessTypeEntity that = (PropertyAccessTypeEntity) o;
+
+        if (data != null ? !data.equals(that.data) : that.data != null) return false;
+        if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result;
+        result = (id != null ? id.hashCode() : 0);
+        result = 31 * result + (data != null ? data.hashCode() : 0);
+        return result;
+    }
+}
\ No newline at end of file

Modified: core/trunk/envers/src/test/resources/hibernate.test.cfg.xml
===================================================================
--- core/trunk/envers/src/test/resources/hibernate.test.cfg.xml	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/test/resources/hibernate.test.cfg.xml	2008-11-03 11:24:30 UTC (rev 15481)
@@ -17,6 +17,12 @@
         <property name="connection.username">sa</property>
         <property name="connection.password"></property>
 
+        <!--<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
+        <property name="connection.url">jdbc:mysql:///hibernate_tests?useUnicode=true&amp;characterEncoding=UTF-8</property>
+        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
+        <property name="connection.username">root</property>
+        <property name="connection.password"></property>-->
+
         <event type="post-insert">
             <listener class="org.hibernate.envers.event.VersionsEventListener" />
         </event>

Modified: core/trunk/envers/src/test/resources/testng.xml
===================================================================
--- core/trunk/envers/src/test/resources/testng.xml	2008-11-03 10:26:13 UTC (rev 15480)
+++ core/trunk/envers/src/test/resources/testng.xml	2008-11-03 11:24:30 UTC (rev 15481)
@@ -3,6 +3,7 @@
 <suite name="Envers">
     <test name="All">
         <packages>
+            <package name="org.hibernate.envers.test.integration.accesstype" />
             <package name="org.hibernate.envers.test.integration.basic" />
             <package name="org.hibernate.envers.test.integration.cache" />
             <package name="org.hibernate.envers.test.integration.collection" />




More information about the hibernate-commits mailing list