[hibernate-commits] Hibernate SVN: r20212 - in core/branches/envers-hibernate-3.3: src/main/java/org/hibernate/envers and 40 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Sat Aug 21 11:15:17 EDT 2010


Author: adamw
Date: 2010-08-21 11:15:15 -0400 (Sat, 21 Aug 2010)
New Revision: 20212

Added:
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
   core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/
   core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
Modified:
   core/branches/envers-hibernate-3.3/pom.xml
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
   core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
   core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
   core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
Log:
Backported changes from 3.5 to 3.3 by Hernan Chanfreau (thanks!)

List of issues:
HHH-4716: NotAuditedException using the entity name concept of hibernate.
HHH-5288: Envers auditReader.find() returns wrong data for embedded components using fields with default values
HHH-3957: Audited Null Embeddable objects not returned as null
HHH-5191: CollectionMetadataGenerator fails to obtain mappedBy attribute when is defined on superclasses
HHH-4899: Type not supported: org.hibernate.type.TimestampType
HHH-4928: Non-Audited Entity with @ManyToOne in PK causes error in Envers 1.2.2
HHH-4731: Public API to know if an entity class is audited
HHH-4900: Wrong immutable type check in IdMetadataGenerator
HHH-4792: Validate fix for HHH-4791
HHH-4693: MapProxy - problems during marshalling/demarchalling
HHH-4793: Revert disabling of VersionsJoinTableRangeComponentNamingTest and fix underlying issue
HHH-4063: NPE reading metadata from an mapped interface

Modified: core/branches/envers-hibernate-3.3/pom.xml
===================================================================
--- core/branches/envers-hibernate-3.3/pom.xml	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/pom.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -7,7 +7,7 @@
     <parent>
         <groupId>org.hibernate</groupId>
         <artifactId>hibernate-parent</artifactId>
-        <version>3.5.0-SNAPSHOT</version>
+        <version>3.5.3-Final</version>
     </parent>
 
     <groupId>org.jboss.envers</groupId>
@@ -125,6 +125,7 @@
 	    <version>3.4.GA</version>
             <scope>test</scope>
         </dependency>
+        
     </dependencies>
 
     <dependencyManagement>
@@ -132,7 +133,7 @@
             <dependency>
                 <groupId>org.hibernate</groupId>
                 <artifactId>hibernate-core</artifactId>
-                <version>3.3.1.GA</version>
+                <version>3.3.2.GA</version>
             </dependency>
             <dependency>
                 <groupId>org.hibernate</groupId>

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,7 +32,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
  */
 public interface AuditReader {
     /**
@@ -49,6 +49,23 @@
      */
     <T> T find(Class<T> cls, Object primaryKey, Number revision) throws
             IllegalArgumentException, NotAuditedException, IllegalStateException;
+    
+    /**
+     * Find an entity by primary key at the given revision with the specified entityName.
+     * @param cls Class of the entity.
+     * @param entityName EntityName to find.
+     * @param primaryKey Primary key of the entity.
+     * @param revision Revision in which to get the entity.
+     * @return The found entity instance at the given revision (its properties may be partially filled
+     * if not all properties are audited) or null, if an entity with that id didn't exist at that
+     * revision.
+     * @throws IllegalArgumentException If cls or primaryKey is null or revision is less or equal to 0.
+     * @throws NotAuditedException When entities of the given class are not audited.
+     * @throws IllegalStateException If the associated entity manager is closed.
+     */
+	<T> T find(Class<T> cls, String entityName, Object primaryKey,
+			Number revision) throws IllegalArgumentException,
+			NotAuditedException, IllegalStateException;
 
     /**
      * Get a list of revision numbers, at which an entity was modified.
@@ -62,6 +79,21 @@
      */
     List<Number> getRevisions(Class<?> cls, Object primaryKey)
             throws IllegalArgumentException, NotAuditedException, IllegalStateException;
+    
+    /**
+     * Get a list of revision numbers, at which an entity was modified, looking by entityName.
+     * @param cls Class of the entity.
+     * @param entityName  EntityName to find.
+     * @param primaryKey Primary key of the entity.
+     * @return A list of revision numbers, at which the entity was modified, sorted in ascending order (so older
+     * revisions come first).
+     * @throws NotAuditedException When entities of the given class are not audited.
+     * @throws IllegalArgumentException If cls or primaryKey is null.
+     * @throws IllegalStateException If the associated entity manager is closed.
+     */
+    List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
+			throws IllegalArgumentException, NotAuditedException,
+			IllegalStateException;
 
     /**
      * Get the date, at which a revision was created.

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -53,6 +53,7 @@
  * @author Adam Warski (adam at warski dot org)
  * @author Sebastian Komander
  * @author Tomasz Bech
+ * @author Hern�n Chanfreau
  */
 public final class AuditMetadataGenerator {
     private static final Logger log = LoggerFactory.getLogger(AuditMetadataGenerator.class);
@@ -285,53 +286,21 @@
         }
     }
 
-	private void addSingleInheritancePersisterHack(Element class_mapping) {
-        class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversSingleTableEntityPersister");
-    }
-
-	private void addJoinedInheritancePersisterHack(Element class_mapping) {
-        class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversJoinedSubclassEntityPersister");
-    }
-
-	private void addTablePerClassInheritancePersisterHack(Element class_mapping) {
-        class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversUnionSubclassEntityPersister");
-    }
-
     @SuppressWarnings({"unchecked"})
     private Triple<Element, ExtendedPropertyMapper, String> generateMappingData(
             PersistentClass pc, EntityXmlMappingData xmlMappingData, AuditTableData auditTableData,
             IdMappingData idMapper) {
-		boolean hasDiscriminator = pc.getDiscriminator() != null;
-
         Element class_mapping = MetadataTools.createEntity(xmlMappingData.getMainXmlMapping(), auditTableData,
-                hasDiscriminator ? pc.getDiscriminatorValue() : null);
+                pc.getDiscriminatorValue());
         ExtendedPropertyMapper propertyMapper = new MultiPropertyMapper();
 
         // Checking if there is a discriminator column
-        if (hasDiscriminator) {
+        if (pc.getDiscriminator() != null) {
             Element discriminator_element = class_mapping.addElement("discriminator");
             MetadataTools.addColumns(discriminator_element, pc.getDiscriminator().getColumnIterator());
             discriminator_element.addAttribute("type", pc.getDiscriminator().getType().getName());
         }
 
-		InheritanceType parentInheritance = InheritanceType.getForParent(pc);
-		switch (parentInheritance) {
-			case NONE:
-				break;
-
-			case SINGLE:
-				addSingleInheritancePersisterHack(class_mapping);
-				break;
-
-			case JOINED:
-				addJoinedInheritancePersisterHack(class_mapping);
-				break;
-
-			case TABLE_PER_CLASS:
-				addTablePerClassInheritancePersisterHack(class_mapping);
-				break;
-		}
-
         // Adding the id mapping
         class_mapping.add((Element) idMapper.getXmlMapping().clone());
 
@@ -385,7 +354,7 @@
 
 			ExtendedPropertyMapper propertyMapper = null;
 			String parentEntityName = null;
-			EntityConfiguration entityCfg = new EntityConfiguration(entityName, idMapper, propertyMapper,
+			EntityConfiguration entityCfg = new EntityConfiguration(entityName, pc.getClassName(), idMapper, propertyMapper,
 					parentEntityName);
 			notAuditedEntitiesConfigurations.put(entityName, entityCfg);
 			return;
@@ -405,7 +374,7 @@
         // Generating a mapping for the id
         IdMappingData idMapper = idMetadataGenerator.addId(pc, true);
 
-        InheritanceType inheritanceType = InheritanceType.getForChild(pc);
+        InheritanceType inheritanceType = InheritanceType.get(pc);
 
         // These properties will be read from the mapping data
         final Element class_mapping;
@@ -427,8 +396,6 @@
             case JOINED:
                 mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "joined-subclass");
 
-				addJoinedInheritancePersisterHack(mappingData.getFirst());
-
                 // Adding the "key" element with all id columns...
                 Element keyMapping = mappingData.getFirst().addElement("key");
                 MetadataTools.addColumns(keyMapping, pc.getTable().getPrimaryKey().columnIterator());
@@ -439,9 +406,6 @@
 
             case TABLE_PER_CLASS:
                 mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
-
-				addTablePerClassInheritancePersisterHack(mappingData.getFirst());
-
                 break;
 
             default:
@@ -464,7 +428,7 @@
         addJoins(pc, propertyMapper, auditingData, pc.getEntityName(), xmlMappingData, true);
 
         // Storing the generated configuration
-        EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName, idMapper,
+        EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName,pc.getClassName(), idMapper,
                 propertyMapper, parentEntityName);
         entitiesConfigurations.put(pc.getEntityName(), entityCfg);
     }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -80,6 +80,7 @@
 /**
  * Generates metadata for a collection-valued property.
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public final class CollectionMetadataGenerator {
     private static final Logger log = LoggerFactory.getLogger(CollectionMetadataGenerator.class);
@@ -108,7 +109,7 @@
      * be created using this object.
      * @param propertyAuditingData 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.
+     * table and the value of the <code>@MapKey</code> annotation, if there was one. 
      */
     public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
                                        Collection propertyValue, CompositeMapperBuilder currentMapper,
@@ -208,7 +209,7 @@
                     // The mapper will only be used to map from entity to map, so no need to provide other details
                     // when constructing the PropertyData.
                     new PropertyData(auditMappedBy, null, null, null),
-                    referencedEntityName, false);
+                    referencingEntityName, false);
 
             // Checking if there's an index defined. If so, adding a mapper for it.
             if (propertyAuditingData.getPositionMappedBy() != null) {
@@ -286,13 +287,13 @@
         // Generating the XML mapping for the middle entity, only if the relation isn't inverse.
         // If the relation is inverse, will be later checked by comparing middleEntityXml with null.
         Element middleEntityXml;
-        if (!propertyValue.isInverse()) {
+        if (!propertyValue.isInverse()) {            
             // Generating a unique middle entity name
             auditMiddleEntityName = mainGenerator.getAuditEntityNameRegister().createUnique(auditMiddleEntityName);
 
             // Registering the generated name
             mainGenerator.getAuditEntityNameRegister().register(auditMiddleEntityName);
-
+                        
             middleEntityXml = createMiddleEntityXml(auditMiddleTableName, auditMiddleEntityName, propertyValue.getWhere());
         } else {
             middleEntityXml = null;
@@ -533,7 +534,6 @@
         return middleEntityXmlId;
     }
 
-    @SuppressWarnings({"unchecked"})
     private String getMappedBy(Collection collectionValue) {
         PersistentClass referencedClass = ((OneToMany) collectionValue.getElement()).getAssociatedClass();
 
@@ -543,8 +543,31 @@
             return auditMappedBy;
         }
 
+        // searching in referenced class
+        String mappedBy = this.searchMappedBy(referencedClass, collectionValue);
+        
+        if(mappedBy == null) {
+            log.debug("Going to search the mapped by attribute for " + propertyName + " in superclasses of entity: " + referencedClass.getClassName());
+            
+            PersistentClass tempClass = referencedClass;
+			while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+	            log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+				mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionValue);
+				tempClass = tempClass.getSuperclass();
+			}
+        }
+
+        if(mappedBy == null) { 
+	        throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+	                + referencedClass.getClassName() + "!");
+        }
+        
+        return mappedBy;
+    }        
+
+    @SuppressWarnings({"unchecked"})
+    private String searchMappedBy(PersistentClass referencedClass, Collection collectionValue) {
         Iterator<Property> assocClassProps = referencedClass.getPropertyIterator();
-
         while (assocClassProps.hasNext()) {
             Property property = assocClassProps.next();
 
@@ -552,13 +575,10 @@
                     collectionValue.getKey().getColumnIterator())) {
                 return property.getName();
             }
-        }
-
-        throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
-                + referencingEntityName + "!");
+        }    	
+        return null;
     }
 
-    @SuppressWarnings({"unchecked"})
     private String getMappedBy(Table collectionTable, PersistentClass referencedClass) {
         // If there's an @AuditMappedBy specified, returning it directly.
         String auditMappedBy = propertyAuditingData.getAuditMappedBy();
@@ -566,6 +586,31 @@
             return auditMappedBy;
         }
 
+        // searching in referenced class
+        String mappedBy = this.searchMappedBy(referencedClass, collectionTable);
+
+        // not found on referenced class, searching on superclasses
+        if(mappedBy == null) { 
+            log.debug("Going to search the mapped by attribute for " + propertyName + " in superclases of entity: " + referencedClass.getClassName());
+
+            PersistentClass tempClass = referencedClass;
+			while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+	            log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+				mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionTable);
+				tempClass = tempClass.getSuperclass();
+			}
+        }
+
+        if(mappedBy == null) { 
+	        throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+	                + referencedClass.getClassName() + "!");
+        }
+        
+        return mappedBy;
+    }
+    
+    @SuppressWarnings({"unchecked"})
+    private String searchMappedBy(PersistentClass referencedClass, Table collectionTable) {
         Iterator<Property> properties = referencedClass.getPropertyIterator();
         while (properties.hasNext()) {
             Property property = properties.next();
@@ -576,9 +621,8 @@
                     return property.getName();
                 }
             }
-        }
-
-        throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
-                + referencingEntityName + "!");
+        }   
+        return null;
     }
+   
 }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -44,27 +44,16 @@
      * @return The inheritance type of this class. NONE, if this class does not inherit from
      * another persisten class.
      */
-    public static InheritanceType getForChild(PersistentClass pc) {
+    public static InheritanceType get(PersistentClass pc) {
         PersistentClass superclass = pc.getSuperclass();
         if (superclass == null) {
             return InheritanceType.NONE;
         }
 
         // We assume that every subclass is of the same type.
-        return doGetForSubclass((Subclass) superclass.getSubclassIterator().next());
-    }
+        Subclass subclass = (Subclass) superclass.getSubclassIterator().next();
 
-	public static InheritanceType getForParent(PersistentClass pc) {
-		if (!pc.getSubclassIterator().hasNext()) {
-			return InheritanceType.NONE;
-		}
-
-		// We assume that every subclass is of the same type.
-        return doGetForSubclass((Subclass) pc.getSubclassIterator().next());
-	}
-
-	private static InheritanceType doGetForSubclass(Subclass subclass) {
-		if (subclass instanceof SingleTableSubclass) {
+        if (subclass instanceof SingleTableSubclass) {
             return InheritanceType.SINGLE;
         } else if (subclass instanceof JoinedSubclass) {
             return InheritanceType.JOINED;
@@ -73,5 +62,5 @@
         }
 
         throw new MappingException("Unknown subclass class: " + subclass.getClass());
-	}
+    }
 }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,18 +32,22 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class EntityConfiguration {
     private String versionsEntityName;
-    private IdMappingData idMappingData;
+    /** Holds the className for instantiation the configured entity */
+    private String entityClassName;
+	private IdMappingData idMappingData;
     private ExtendedPropertyMapper propertyMapper;
     // Maps from property name
     private Map<String, RelationDescription> relations;
     private String parentEntityName;
 
-    public EntityConfiguration(String versionsEntityName, IdMappingData idMappingData,
+    public EntityConfiguration(String versionsEntityName, String entityClassName, IdMappingData idMappingData,
                                ExtendedPropertyMapper propertyMapper, String parentEntityName) {
         this.versionsEntityName = versionsEntityName;
+        this.entityClassName = entityClassName;
         this.idMappingData = idMappingData;
         this.propertyMapper = propertyMapper;
         this.parentEntityName = parentEntityName;
@@ -113,4 +117,11 @@
     Iterable<RelationDescription> getRelationsIterator() {
         return relations.values();
     }
+    
+    /**
+     * @return the className for the configured entity
+     */
+    public String getEntityClassName() {
+		return entityClassName;
+	}    
 }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -36,6 +36,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class EntityInstantiator {
     private final AuditConfiguration verCfg;
@@ -80,7 +81,13 @@
         // If it is not in the cache, creating a new entity instance
         Object ret;
         try {
-            Class<?> cls = ReflectionTools.loadClass(entityName);
+        	EntityConfiguration entCfg = verCfg.getEntCfg().get(entityName);
+        	if(entCfg == null) {
+        		// a relation marked as RelationTargetAuditMode.NOT_AUDITED 
+        		entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(entityName);
+        	}
+
+            Class<?> cls = ReflectionTools.loadClass(entCfg.getEntityClassName());
             ret = ReflectHelper.getDefaultConstructor(cls).newInstance();
         } catch (Exception e) {
             throw new AuditException(e);

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -24,19 +24,19 @@
 package org.hibernate.envers.entities.mapper;
 
 import java.io.Serializable;
+import java.lang.reflect.Field;
 import java.util.List;
 import java.util.Map;
 
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.entities.PropertyData;
-import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 import org.hibernate.envers.tools.reflection.ReflectionTools;
-
-import org.hibernate.collection.PersistentCollection;
 import org.hibernate.property.Setter;
 import org.hibernate.util.ReflectHelper;
-import org.hibernate.engine.SessionImplementor;
 
 /**
  * @author Adam Warski (adam at warski dot org)
@@ -84,8 +84,12 @@
 			}
 		}
 
-		// And we don't have to set anything on the object - the default value is null
-		if (!allNullAndSingle) {
+		if (allNullAndSingle) {
+			// single property, but default value need not be null, so we'll set it to null anyway 
+			setter.set(obj, null, null);
+			
+		} else {
+			// set the component
 			try {
 				Object subObj = ReflectHelper.getDefaultConstructor(
 						Thread.currentThread().getContextClassLoader().loadClass(componentClassName)).newInstance();
@@ -97,7 +101,7 @@
 		}
     }
 
-    public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
+ 	public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
                                                                                     PersistentCollection newColl,
                                                                                     Serializable oldColl,
                                                                                     Serializable id) {

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -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.EntityConfiguration;
 import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.query.AuditEntity;
@@ -44,6 +45,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class OneToOneNotOwningMapper implements PropertyMapper {
     private String owningReferencePropertyName;
@@ -66,12 +68,18 @@
             return;
         }
 
-        Class<?> entityClass = ReflectionTools.loadClass(owningEntityName);
+    	EntityConfiguration entCfg = verCfg.getEntCfg().get(owningEntityName);
+    	if(entCfg == null) {
+    		// a relation marked as RelationTargetAuditMode.NOT_AUDITED 
+    		entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(owningEntityName);
+    	}
 
+        Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
+
         Object value;
 
         try {
-            value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision)
+            value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, owningEntityName, revision)
                     .add(AuditEntity.relatedId(owningReferencePropertyName).eq(primaryKey)).getSingleResult();
         } catch (NoResultException e) {
             value = null;

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -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.EntityConfiguration;
 import org.hibernate.envers.entities.PropertyData;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 import org.hibernate.envers.tools.Tools;
@@ -44,6 +45,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class ToOneIdMapper implements PropertyMapper {
     private final IdMapper delegate;
@@ -68,7 +70,7 @@
         delegate.mapToMapFromEntity(newData, nonInsertableFake ? oldObj : newObj);
 
         //noinspection SimplifiableConditionalExpression
-        return nonInsertableFake ? false : !Tools.entitiesEqual(session, newObj, oldObj);
+        return nonInsertableFake ? false : !Tools.entitiesEqual(session, referencedEntityName, newObj, oldObj);
     }
 
     public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
@@ -85,7 +87,13 @@
             if (versionsReader.getFirstLevelCache().contains(referencedEntityName, revision, entityId)) {
                 value = versionsReader.getFirstLevelCache().get(referencedEntityName, revision, entityId);
             } else {
-                Class<?> entityClass = ReflectionTools.loadClass(referencedEntityName);
+            	EntityConfiguration entCfg = verCfg.getEntCfg().get(referencedEntityName);
+            	if(entCfg == null) {
+            		// a relation marked as RelationTargetAuditMode.NOT_AUDITED 
+            		entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(referencedEntityName);
+            	}
+            	
+                Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
 
                 value = versionsReader.getSessionImplementor().getFactory().getEntityPersister(referencedEntityName).
                         createProxy((Serializable)entityId, new ToOneDelegateSessionImplementor(versionsReader, entityClass, entityId, revision, verCfg));

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,7 +27,6 @@
 
 import org.hibernate.envers.configuration.AuditConfiguration;
 import org.hibernate.envers.entities.EntitiesConfigurations;
-import org.hibernate.envers.entities.EntityConfiguration;
 import org.hibernate.envers.reader.AuditReaderImplementor;
 
 import org.hibernate.HibernateException;
@@ -35,6 +34,7 @@
 /**
  * @author Adam Warski (adam at warski dot org)
  * @author Tomasz Bech
+ * @author Hern�n Chanfreau
  */
 public class ToOneDelegateSessionImplementor extends AbstractDelegateSessionImplementor {
 	private static final long serialVersionUID = 4770438372940785488L;
@@ -43,7 +43,7 @@
     private final Class<?> entityClass;
     private final Object entityId;
     private final Number revision;
-	private EntityConfiguration notVersionedEntityConfiguration;
+    private EntitiesConfigurations entCfg;
 
 	public ToOneDelegateSessionImplementor(AuditReaderImplementor versionsReader,
                                            Class<?> entityClass, Object entityId, Number revision,
@@ -53,14 +53,15 @@
         this.entityClass = entityClass;
         this.entityId = entityId;
         this.revision = revision;
-        EntitiesConfigurations entCfg = verCfg.getEntCfg();
-        notVersionedEntityConfiguration = entCfg.getNotVersionEntityConfiguration(entityClass.getName());
+        this.entCfg = verCfg.getEntCfg();
     }
 
     public Object doImmediateLoad(String entityName) throws HibernateException {
-		if (notVersionedEntityConfiguration == null) {
-			return versionsReader.find(entityClass, entityId, revision);
+    	if(entCfg.getNotVersionEntityConfiguration(entityName) == null){
+    		// audited relation, look up entity with envers
+			return versionsReader.find(entityClass, entityName, entityId, revision);
 		} else {
+			// notAudited relation, look up entity with hibernate
 			return delegate.immediateLoad(entityName, (Serializable) entityId);
 		}
     }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -61,6 +61,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class AuditEventListener implements PostInsertEventListener, PostUpdateEventListener,
         PostDeleteEventListener, PreCollectionUpdateEventListener, PreCollectionRemoveEventListener,
@@ -91,7 +92,7 @@
                 Object oldValue = oldState == null ? null : oldState[i];
                 Object newValue = newState == null ? null : newState[i];
 
-                if (!Tools.entitiesEqual(session, oldValue, newValue)) {
+                if (!Tools.entitiesEqual(session, relDesc.getToEntityName(), oldValue, newValue)) {
                     // We have to generate changes both in the old collection (size decreses) and new collection
                     // (size increases).
                     if (newValue != null) {

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class AuditQueryCreator {
     private final AuditConfiguration auditCfg;
@@ -56,6 +57,22 @@
         checkPositive(revision, "Entity revision");
         return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, revision);
     }
+    
+    /**
+     * Creates a query, which will return entities satisfying some conditions (specified later),
+     * at a given revision and a given entityName.
+     * @param c Class of the entities for which to query.
+     * @param entityName EntityName of the entities for which to query.
+     * @param revision Revision number at which to execute the query.
+     * @return A query for entities at a given revision, to which conditions can be added and which
+     * can then be executed. The result of the query will be a list of entities (beans), unless a
+     * projection is added.
+     */
+    public AuditQuery forEntitiesAtRevision(Class<?> c, String entityName, Number revision) {
+        checkNotNull(revision, "Entity revision");
+        checkPositive(revision, "Entity revision");
+        return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, entityName, revision);
+    }    
 
     /**
      * Creates a query, which selects the revisions, at which the given entity was modified.
@@ -80,4 +97,30 @@
     public AuditQuery forRevisionsOfEntity(Class<?> c, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
         return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities);
     }
+    
+    /**
+     * Creates a query, which selects the revisions, at which the given entity was modified and with a given entityName.
+     * Unless an explicit projection is set, the result will be a list of three-element arrays, containing:
+     * <ol>
+     * <li>the entity instance</li>
+     * <li>revision entity, corresponding to the revision at which the entity was modified. If no custom
+     * revision entity is used, this will be an instance of {@link org.hibernate.envers.DefaultRevisionEntity}</li>
+     * <li>type of the revision (an enum instance of class {@link org.hibernate.envers.RevisionType})</li>.
+     * </ol>
+     * Additional conditions that the results must satisfy may be specified.
+     * @param c Class of the entities for which to query.
+     * @param entityName EntityName of the entities for which to query.
+     * @param selectEntitiesOnly If true, instead of a list of three-element arrays, a list of entites will be
+     * returned as a result of executing this query.
+     * @param selectDeletedEntities If true, also revisions where entities were deleted will be returned. The additional
+     * entities will have revision type "delete", and contain no data (all fields null), except for the id field.
+     * @return A query for revisions at which instances of the given entity were modified, to which
+     * conditions can be added (for example - a specific id of an entity of class <code>c</code>), and which
+     * can then be executed. The results of the query will be sorted in ascending order by the revision number,
+     * unless an order or projection is added.
+     */
+    public AuditQuery forRevisionsOfEntity(Class<?> c, String entityName, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+        return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, entityName, selectEntitiesOnly,selectDeletedEntities);
+    }
+    
 }

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,14 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public abstract class AbstractAuditQuery implements AuditQuery {
     protected EntityInstantiator entityInstantiator;
     protected List<AuditCriterion> criterions;
 
     protected String entityName;
+    protected String entityClassName;
     protected String versionsEntityName;
     protected QueryBuilder qb;
 
@@ -66,18 +68,25 @@
 
     protected AbstractAuditQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader,
                                     Class<?> cls) {
-        this.verCfg = verCfg;
-        this.versionsReader = versionsReader;
+    	this(verCfg, versionsReader, cls, cls.getName());
+    }
 
-        criterions = new ArrayList<AuditCriterion>();
-        entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
+	protected AbstractAuditQuery(AuditConfiguration verCfg,
+			AuditReaderImplementor versionsReader, Class<?> cls, String entityName) {
+		this.verCfg = verCfg;
+		this.versionsReader = versionsReader;
 
-        entityName = cls.getName();
-        versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(entityName);
+		criterions = new ArrayList<AuditCriterion>();
+		entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
 
-        qb = new QueryBuilder(versionsEntityName, "e");
-    }
+		entityClassName = cls.getName();
+		this.entityName = entityName;
+		versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(
+				entityName);
 
+		qb = new QueryBuilder(versionsEntityName, "e");
+	}
+    
     protected List buildAndExecuteQuery() {
         StringBuilder querySb = new StringBuilder();
         Map<String, Object> queryParamValues = new HashMap<String, Object>();

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -35,6 +35,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
     private final Number revision;
@@ -45,6 +46,12 @@
         super(verCfg, versionsReader, cls);
         this.revision = revision;
     }
+    
+	public EntitiesAtRevisionQuery(AuditConfiguration verCfg,
+			AuditReaderImplementor versionsReader, Class<?> cls, String entityName, Number revision) {
+		super(verCfg, versionsReader, cls, entityName);
+		this.revision = revision;
+	}    
 
     @SuppressWarnings({"unchecked"})
     public List list() {

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -33,11 +33,11 @@
 import org.hibernate.envers.exception.AuditException;
 import org.hibernate.envers.query.criteria.AuditCriterion;
 import org.hibernate.envers.reader.AuditReaderImplementor;
-
 import org.hibernate.proxy.HibernateProxy;
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class RevisionsOfEntityQuery extends AbstractAuditQuery {
     private final boolean selectEntitiesOnly;
@@ -53,6 +53,15 @@
         this.selectDeletedEntities = selectDeletedEntities;
     }
 
+	public RevisionsOfEntityQuery(AuditConfiguration verCfg,
+			AuditReaderImplementor versionsReader, Class<?> cls, String entityName,
+			boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+		super(verCfg, versionsReader, cls, entityName);
+
+		this.selectEntitiesOnly = selectEntitiesOnly;
+		this.selectDeletedEntities = selectDeletedEntities;
+	}
+	
     private Number getRevisionNumber(Map versionsEntity) {
         AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
 

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -45,7 +45,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
  */
 public class AuditReaderImpl implements AuditReaderImplementor {
     private final AuditConfiguration verCfg;
@@ -80,17 +80,22 @@
         return firstLevelCache;
     }
 
-    @SuppressWarnings({"unchecked"})
     public <T> T find(Class<T> cls, Object primaryKey, Number revision) throws
             IllegalArgumentException, NotAuditedException, IllegalStateException {
+    	
+    	return this.find(cls, cls.getName(), primaryKey, revision);
+    }
+    
+    @SuppressWarnings({"unchecked"})
+    public <T> T find(Class<T> cls, String entityName, Object primaryKey, Number revision) throws
+            IllegalArgumentException, NotAuditedException, IllegalStateException {
         checkNotNull(cls, "Entity class");
+        checkNotNull(entityName, "Entity name");
         checkNotNull(primaryKey, "Primary key");
         checkNotNull(revision, "Entity revision");
         checkPositive(revision, "Entity revision");
         checkSession();
 
-        String entityName = cls.getName();
-
         if (!verCfg.getEntCfg().isVersioned(entityName)) {
             throw new NotAuditedException(entityName, entityName + " is not versioned!");
         }
@@ -102,7 +107,7 @@
         Object result;
         try {
             // The result is put into the cache by the entity instantiator called from the query
-            result = createQuery().forEntitiesAtRevision(cls, revision)
+            result = createQuery().forEntitiesAtRevision(cls, entityName, revision)
                 .add(AuditEntity.id().eq(primaryKey)).getSingleResult();
         } catch (NoResultException e) {
             result = null;
@@ -111,23 +116,28 @@
         }
 
         return (T) result;
+    }    
+
+    public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+            throws IllegalArgumentException, NotAuditedException, IllegalStateException {
+    	
+    	return this.getRevisions(cls, cls.getName(), primaryKey);
     }
 
     @SuppressWarnings({"unchecked"})
-    public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+    public List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
             throws IllegalArgumentException, NotAuditedException, IllegalStateException {
         // todo: if a class is not versioned from the beginning, there's a missing ADD rev - what then?
         checkNotNull(cls, "Entity class");
+        checkNotNull(entityName, "Entity name");
         checkNotNull(primaryKey, "Primary key");
         checkSession();
 
-        String entityName = cls.getName();
-
         if (!verCfg.getEntCfg().isVersioned(entityName)) {
             throw new NotAuditedException(entityName, entityName + " is not versioned!");
         }
 
-        return createQuery().forRevisionsOfEntity(cls, false, true)
+        return createQuery().forRevisionsOfEntity(cls, entityName, false, true)
                 .addProjection(AuditEntity.revisionNumber())
                 .add(AuditEntity.id().eq(primaryKey))
                 .getResultList();

Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
 
 /**
  * @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
  */
 public class Tools {
     public static <K,V> Map<K,V> newHashMap() {
@@ -46,14 +47,14 @@
         return new LinkedHashMap<K,V>();
     }
 
-	public static boolean entitiesEqual(SessionImplementor session, Object obj1, Object obj2) {
-        Object id1 = getIdentifier(session, obj1);
-		Object id2 = getIdentifier(session, obj2);
+	public static boolean entitiesEqual(SessionImplementor session, String entityName, Object obj1, Object obj2) {
+        Object id1 = getIdentifier(session, entityName, obj1);
+		Object id2 = getIdentifier(session, entityName, obj2);
 
         return objectsEqual(id1, id2);
-    }
+    }	
 
-	public static Object getIdentifier(SessionImplementor session, Object obj) {
+	public static Object getIdentifier(SessionImplementor session, String entityName, Object obj) {
 		if (obj == null) {
 			return null;
 		}
@@ -64,7 +65,7 @@
 		}
 
 
-		return session.getEntityPersister(null, obj).getIdentifier(obj, session.getEntityMode());
+		return session.getEntityPersister(entityName, obj).getIdentifier(obj, session.getEntityMode());
 	}
 
     public static Object getTargetFromProxy(SessionFactoryImplementor sessionFactoryImplementor, HibernateProxy proxy) {
@@ -73,12 +74,18 @@
         }
 
         SessionImplementor sessionImplementor = proxy.getHibernateLazyInitializer().getSession();
-        Session tempSession = sessionImplementor==null ? sessionFactoryImplementor.openTemporarySession() : sessionImplementor.getFactory().openTemporarySession();
+        Session tempSession = sessionImplementor==null
+				? sessionFactoryImplementor.openTemporarySession()
+				: sessionImplementor.getFactory().openTemporarySession();
         try {
-            proxy.getHibernateLazyInitializer().setSession((SessionImplementor) tempSession);
-            proxy.getHibernateLazyInitializer().initialize();
-            return proxy.getHibernateLazyInitializer().getImplementation();
-        } finally {
+			Object target = tempSession.get(
+					proxy.getHibernateLazyInitializer().getEntityName(),
+					proxy.getHibernateLazyInitializer().getIdentifier()
+			);
+			proxy.getHibernateLazyInitializer().setImplementation( target );
+			return target;
+        }
+		finally {
             tempSession.close();
         }
     }

Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -89,7 +89,12 @@
         if (audited) {
             initListeners();
         }
+
         cfg.configure("hibernate.test.cfg.xml");
+
+        // Separate database for each test class
+        cfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:" + this.getClass().getName());
+
         configure(cfg);
         emf = cfg.buildEntityManagerFactory();
 

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,79 @@
+package org.hibernate.envers.test;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.envers.AuditReader;
+import org.hibernate.envers.AuditReaderFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+/**
+ * Base class for testing envers with Session.
+ * 
+ * @author Hern�n Chanfreau
+ *
+ */
+public abstract class AbstractSessionTest {
+
+	protected Configuration config;
+	private SessionFactory sessionFactory;
+	private Session session ;
+	private AuditReader auditReader;
+	
+	
+	@BeforeClass
+    public void init() {
+		config = new AnnotationConfiguration();
+        try {
+            URL url = Thread.currentThread().getContextClassLoader().getResource("hibernate.test.session-cfg.xml");
+            config.configure(new File(url.toURI()));
+            this.initMappings();
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		sessionFactory = config.buildSessionFactory();
+    }
+	
+	protected abstract void initMappings() throws MappingException, URISyntaxException ;
+
+
+
+	private SessionFactory getSessionFactory(){
+		return sessionFactory;
+    }
+
+
+    @BeforeMethod
+    public void newSessionFactory() {
+      session = getSessionFactory().openSession();
+      auditReader = AuditReaderFactory.get(session);
+    }
+	
+	@AfterClass
+	public void closeSessionFactory() {
+	    sessionFactory.close();
+	}
+	
+	
+	protected Session getSession() {
+		return session;
+	}
+
+
+
+	protected AuditReader getAuditReader() {
+		return auditReader;
+	}
+
+}
+

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,68 @@
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.Embedded;
+
+/**
+ * 
+ * @author Erik-Berndt Scheper
+ * 
+ */
+public class DefaultValueComponent1 {
+
+	private String str1;
+
+	@Embedded
+	private DefaultValueComponent2 comp2 = new DefaultValueComponent2();
+
+	public static final DefaultValueComponent1 of(String str1,
+			DefaultValueComponent2 comp2) {
+		DefaultValueComponent1 instance = new DefaultValueComponent1();
+		instance.setStr1(str1);
+		instance.setComp2(comp2);
+		return instance;
+	}
+
+	public String getStr1() {
+		return str1;
+	}
+
+	public void setStr1(String str1) {
+		this.str1 = str1;
+	}
+
+	public DefaultValueComponent2 getComp2() {
+		return comp2;
+	}
+
+	public void setComp2(DefaultValueComponent2 comp2) {
+		this.comp2 = comp2;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof DefaultValueComponent1))
+			return false;
+
+		DefaultValueComponent1 that = (DefaultValueComponent1) o;
+
+		if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+			return false;
+		if (comp2 != null ? !comp2.equals(that.comp2) : that.comp2 != null)
+			return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = (str1 != null ? str1.hashCode() : 0);
+		result = 31 * result + (comp2 != null ? comp2.hashCode() : 0);
+		return result;
+	}
+
+	public String toString() {
+		return "Comp1(str1 = " + str1 + ", comp2 = " + comp2 + ")";
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,64 @@
+package org.hibernate.envers.test.entities.components;
+
+/**
+ * 
+ * @author Erik-Berndt Scheper
+ * 
+ */
+public class DefaultValueComponent2 {
+
+	private String str1 = "defaultValue";
+
+	private String str2;
+
+	public static final DefaultValueComponent2 of(String str1, String str2) {
+		DefaultValueComponent2 instance = new DefaultValueComponent2();
+		instance.setStr1(str1);
+		instance.setStr2(str2);
+		return instance;
+	}
+
+	public String getStr2() {
+		return str2;
+	}
+
+	public void setStr2(String str2) {
+		this.str2 = str2;
+	}
+
+	public String getStr1() {
+		return str1;
+	}
+
+	public void setStr1(String str1) {
+		this.str1 = str1;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof DefaultValueComponent2))
+			return false;
+
+		DefaultValueComponent2 that = (DefaultValueComponent2) o;
+
+		if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+			return false;
+		if (str2 != null ? !str2.equals(that.str2) : that.str2 != null)
+			return false;
+
+		return true;
+	}
+
+	public int hashCode() {
+		int result;
+		result = (str1 != null ? str1.hashCode() : 0);
+		result = 31 * result + (str2 != null ? str2.hashCode() : 0);
+		return result;
+	}
+
+	public String toString() {
+		return "Comp2(str1 = " + str1 + ", str2 = " + str2 + ")";
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -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.entities.components;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Erik-Berndt Scheper
+ */
+ at Entity
+ at Audited
+public class DefaultValueComponentTestEntity {
+	@Id
+	@GeneratedValue
+	private Integer id;
+
+	@Embedded
+	@Audited
+	@AttributeOverrides( { @AttributeOverride(name = "comp2.str1", column = @Column(name = "COMP2_STR1")) })
+	private DefaultValueComponent1 comp1 = null;
+
+	public DefaultValueComponentTestEntity() {
+	}
+
+	public static DefaultValueComponentTestEntity of(
+			DefaultValueComponent1 comp1) {
+		DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+		instance.setComp1(comp1);
+		return instance;
+	}
+
+	public static DefaultValueComponentTestEntity of(Integer id,
+			DefaultValueComponent1 comp1) {
+		DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+		instance.setId(id);
+		instance.setComp1(comp1);
+		return instance;
+	}
+
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public DefaultValueComponent1 getComp1() {
+		return comp1;
+	}
+
+	public void setComp1(DefaultValueComponent1 comp1) {
+		this.comp1 = comp1;
+	}
+
+	public boolean equals(Object o) {
+		if (this == o)
+			return true;
+		if (!(o instanceof DefaultValueComponentTestEntity))
+			return false;
+
+		DefaultValueComponentTestEntity that = (DefaultValueComponentTestEntity) o;
+
+		if (comp1 != null ? !comp1.equals(that.comp1) : that.comp1 != 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 + (comp1 != null ? comp1.hashCode() : 0);
+		return result;
+	}
+
+	public String toString() {
+		return "CTE(id = " + id + ", comp1 = " + comp1 + ")";
+	}
+}

Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -37,7 +37,7 @@
 public class EmbIdWithCustomType implements Serializable {
     private Integer x;
 
-    @Type(type = "customEnum")
+    @Type(type = "org.hibernate.envers.test.entities.ids.CustomEnumUserType")
     private CustomEnum customEnum;
 
     public EmbIdWithCustomType() {

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ReadEntityWhtiEntityNameTest extends AbstractSessionTest{
+
+	private long id_pers1;
+	private long id_pers2;
+	private long id_pers3;
+	
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/auditedEntity/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 28);
+        Person pers2 = new Person("Leandro", 29);
+        Person pers3 = new Person("Barba", 30);
+        
+        //REV 1 
+        getSession().getTransaction().begin();
+        getSession().persist("Personaje",pers1);
+        id_pers1 = pers1.getId();
+        getSession().getTransaction().commit();
+
+        //REV 2
+        getSession().getTransaction().begin();
+        pers1 = (Person)getSession().get("Personaje", id_pers1);
+        pers1.setAge(29);
+        getSession().persist("Personaje",pers1);
+        getSession().persist("Personaje",pers2);
+        id_pers2 = pers2.getId();
+        getSession().getTransaction().commit();
+
+        //REV 
+        getSession().getTransaction().begin();
+        pers1 = (Person)getSession().get("Personaje", id_pers1);
+        pers1.setName("Hernan David");
+        pers2 = (Person)getSession().get("Personaje", id_pers2);
+        pers2.setAge(30);
+        getSession().persist("Personaje",pers1);
+        getSession().persist("Personaje",pers2);
+        getSession().persist("Personaje",pers3);
+        id_pers3 = pers3.getId();
+        getSession().getTransaction().commit();
+        
+    }
+    
+    
+    @Test
+    public void testRetrieveRevisionsWithEntityName() {
+    	List<Number> pers1Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers1);
+    	List<Number> pers2Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers2);
+    	List<Number> pers3Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers3);
+    	
+    	assert(pers1Revs.size() == 3);
+    	assert(pers2Revs.size() == 2);
+    	assert(pers3Revs.size() == 1);
+    }
+    
+    @Test
+    public void testRetrieveAuditedEntityWithEntityName() {
+    	Person Person1 = getAuditReader().find(Person.class, "Personaje", id_pers1, 1);
+    	Person Person2 = getAuditReader().find(Person.class, "Personaje", id_pers1, 2);
+    	Person Person3 = getAuditReader().find(Person.class, "Personaje", id_pers1, 3);
+    	
+    	System.out.println("Revision 1:");
+    	System.out.println("  > Name: " + Person1.getName());
+    	System.out.println("  > Age: " + Person1.getAge());
+    	System.out.println("Revision 2:");
+    	System.out.println("  > Name: " + Person2.getName());
+    	System.out.println("  > Age: " + Person2.getAge());
+    	System.out.println("Revision 3:");
+    	System.out.println("  > Name: " + Person3.getName());
+    	System.out.println("  > Age: " + Person3.getAge());
+    }
+    
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Car {
+	
+	private long id;
+	
+	private int number;
+	
+	private List<Person> owners;
+
+	
+	public Car() { }
+
+	public Car(int number, List<Person> owners) {
+		this.number = number;
+		this.owners = owners;
+	}
+
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public List<Person> getOwners() {
+		return owners;
+	}
+
+	public void setOwners(List<Person> owners) {
+		this.owners = owners;
+	}	
+
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,63 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	private List<Car> cars;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+	public List<Car> getCars() {
+		return cars;
+	}
+
+	public void setCars(List<Car> cars) {
+		this.cars = cars;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ReadEntityWithAuditedManyToManyTest extends AbstractSessionTest{
+
+	private long id_car1;
+	private long id_car2;
+	
+	private long id_pers1;
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/manyToManyAudited/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 28);
+        Person pers2 = new Person("Leandro", 29);
+        Person pers3 = new Person("Barba", 32);
+        Person pers4 = new Person("Camomo", 15);
+
+        //REV 1 
+        getSession().getTransaction().begin();
+        List<Person > owners = new ArrayList<Person>();
+        owners.add(pers1);
+        owners.add(pers2);
+        owners.add(pers3);
+        Car car1 = new Car(5, owners);
+
+        getSession().persist(car1);
+        getSession().getTransaction().commit();
+        id_pers1 = pers1.getId();
+        id_car1 = car1.getId();
+
+        owners = new ArrayList<Person>();
+        owners.add(pers2);
+        owners.add(pers3);
+        owners.add(pers4);
+        Car car2 = new Car(27, owners);
+        //REV 2
+        getSession().getTransaction().begin();
+        Person person1 = (Person)getSession().get("Personaje", id_pers1);
+        person1.setName("Hernan David");
+        person1.setAge(40);
+        getSession().persist(car1);
+        getSession().persist(car2);
+        getSession().getTransaction().commit();
+        id_car2 = car2.getId();
+
+    }
+    
+    @Test
+    public void testObtainManyYoManyWithEntityName() {
+    	
+    	Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+    	Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+    	System.out.println("  > Car: " + car1.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car1.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+    		System.out.println("    > Cars owned:");
+    		for (Car ownedCar : owner.getCars()) {
+				System.out.println("      o Car: " + ownedCar.getNumber());
+			}
+		}
+    	System.out.println("  > Car: " + car2.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car2.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+    		System.out.println("    > Cars owned:");
+    		for (Car ownedCar : owner.getCars()) {
+				System.out.println("      o Car: " + ownedCar.getNumber());
+			}
+		}
+    }
+    
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Car {
+	
+	private long id;
+	
+	private int number;
+	
+	private List<Person> owners;
+
+	
+	public Car() { }
+
+	public Car(int number, List<Person> owners) {
+		this.number = number;
+		this.owners = owners;
+	}
+
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public List<Person> getOwners() {
+		return owners;
+	}
+
+	public void setOwners(List<Person> owners) {
+		this.owners = owners;
+	}	
+
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,89 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+	private long id_car1;
+	private long id_car2;
+	
+	private long id_pers1;
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyAudited/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 28);
+        Person pers2 = new Person("Leandro", 29);
+        Person pers3 = new Person("Barba", 32);
+        Person pers4 = new Person("Camomo", 15);
+
+        List<Person > owners = new ArrayList<Person>();
+        owners.add(pers1);
+        owners.add(pers2);
+        Car car1 = new Car(5, owners);
+
+        //REV 1 
+        getSession().getTransaction().begin();
+        getSession().persist(car1);
+        getSession().getTransaction().commit();
+        id_pers1 = pers1.getId();
+        id_car1 = car1.getId();
+
+        owners = new ArrayList<Person>();
+        owners.add(pers2);
+        owners.add(pers4);
+        Car car2 = new Car(27, owners);
+        //REV 2
+        getSession().getTransaction().begin();
+        Person person1 = (Person)getSession().get("Personaje", id_pers1);
+        person1.setName("Hernan David");
+        person1.setAge(40);
+        getSession().persist(car1);
+        getSession().persist(car2);
+        getSession().getTransaction().commit();
+        id_car2 = car2.getId();
+
+    }
+    
+    @Test
+    public void testObtainCollectionWithEntityName() {
+    	
+    	Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+    	Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+    	System.out.println("  > Car: " + car1.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car1.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+		}
+    	System.out.println("  > Car: " + car2.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car2.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+		}
+    }
+    
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,58 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class Car {
+	
+	private long id;
+	
+	private int number;
+	
+	private List<Person> owners;
+
+	
+	public Car() { }
+
+	public Car(int number, List<Person> owners) {
+		this.number = number;
+		this.owners = owners;
+	}
+
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	@Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+	public List<Person> getOwners() {
+		return owners;
+	}
+
+	public void setOwners(List<Person> owners) {
+		this.owners = owners;
+	}	
+
+	@Audited
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,84 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+	private long id_car1;
+	private long id_car2;
+	
+	private long id_pers1;
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 28);
+        Person pers2 = new Person("Leandro", 29);
+        Person pers3 = new Person("Barba", 32);
+        Person pers4 = new Person("Camomo", 15);
+
+        List<Person > owners = new ArrayList<Person>();
+        owners.add(pers1);
+        owners.add(pers2);
+        Car car1 = new Car(5, owners);
+
+        //REV 1 
+        getSession().getTransaction().begin();
+        getSession().persist(car1);
+        getSession().getTransaction().commit();
+        id_pers1 = pers1.getId();
+        id_car1 = car1.getId();
+
+        owners = new ArrayList<Person>();
+        owners.add(pers2);
+        owners.add(pers4);
+        Car car2 = new Car(27, owners);
+        //REV 2
+        getSession().getTransaction().begin();
+        Person person1 = (Person)getSession().get("Personaje", id_pers1);
+        person1.setName("Hernan David");
+        person1.setAge(40);
+        getSession().persist(car1);
+        getSession().persist(car2);
+        getSession().getTransaction().commit();
+        id_car2 = car2.getId();
+
+    }
+    
+    @Test
+    public void testObtainCollectionWithEntityNameAndNotAuditedMode() {
+    	
+    	Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+    	Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+    	System.out.println("  > Car: " + car1.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car1.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+		}
+    	System.out.println("  > Car: " + car2.getNumber());
+    	System.out.println("  > Owners:");
+    	for (Person owner : car2.getOwners()) {
+    		System.out.println("    > Name: " + owner.getName() + " - Age:" + owner.getAge());
+		}
+    }
+    
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,54 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Car {
+	
+	private long id;
+	
+	private int number;
+	
+	private Person owner;
+
+	
+	public Car() { }
+
+	public Car(int number, Person owner) {
+		this.number = number;
+		this.owner = owner;
+	}
+
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Person getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}	
+
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+ at Audited
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,77 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ReadEntityAssociatedAuditedTest extends AbstractSessionTest{
+
+	private long id_car1;
+	private long id_car2;
+	
+	private long id_pers1; 
+	private long id_pers2; 
+	
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 15);
+        Person pers2 = new Person("Leandro", 19);
+        
+        Car car1 = new Car(1, pers1);
+        Car car2 = new Car(2, pers2);
+        
+        //REV 1 
+        getSession().getTransaction().begin();
+        getSession().persist("Personaje",pers1);
+        getSession().persist(car1);
+        getSession().getTransaction().commit();
+        id_car1 = car1.getId();
+        id_pers1 = pers1.getId();
+
+        //REV 2
+        getSession().getTransaction().begin();
+        pers1.setAge(50);
+        getSession().persist("Personaje", pers1);
+        getSession().persist("Personaje", pers2);
+        getSession().persist(car2);
+        getSession().getTransaction().commit();
+        id_car2 = car2.getId();
+        id_pers2 = pers2.getId();
+
+    }
+    
+    @Test
+    public void testGetAssociationWithEntityName() {
+
+    	Person person1 = (Person)getSession().get("Personaje", id_pers1);
+    	Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+    	Person person1_1 = car1.getOwner();
+    	assert(person1.getAge() != person1_1.getAge());
+    	
+    	Person person2 = (Person)getSession().get("Personaje", id_pers2);
+    	Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+    	Person person2_1 = car2.getOwner();
+    	assert(person2.getAge() == person2_1.getAge());
+    }
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class Car {
+	
+	private long id;
+	
+	private int number;
+	
+	private Person owner;
+
+	
+	public Car() { }
+
+	public Car(int number, Person owner) {
+		this.number = number;
+		this.owner = owner;
+	}
+
+	
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	@Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+	public Person getOwner() {
+		return owner;
+	}
+
+	public void setOwner(Person owner) {
+		this.owner = owner;
+	}	
+
+	@Audited
+	public int getNumber() {
+		return number;
+	}
+
+	public void setNumber(int number) {
+		this.number = number;
+	}
+
+
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class Person {
+	
+	private long id;
+	
+	private String name;
+	
+	private int age;
+	
+	public Person(){ }
+	
+	public Person(String name, int age){
+		this.name = name;
+		this.age = age;
+	}
+	
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public int getAge() {
+		return age;
+	}
+
+	public void setAge(int age) {
+		this.age = age;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,80 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ReadEntityAssociatedNotAuditedTest extends AbstractSessionTest{
+
+	private long id_car1;
+	private long id_car2;
+	
+	private long id_pers1; 
+	private long id_pers2; 
+	
+	
+	protected void initMappings() throws MappingException, URISyntaxException {
+		URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml");
+        config.addFile(new File(url.toURI()));
+	}
+	
+	
+    @BeforeClass(dependsOnMethods = "init")
+    public void initData() {
+    	
+    	newSessionFactory();
+
+        Person pers1 = new Person("Hernan", 15);
+        Person pers2 = new Person("Leandro", 19);
+        
+        Car car1 = new Car(1, pers1);
+        Car car2 = new Car(2, pers2);
+        
+        //REV 1 
+        getSession().getTransaction().begin();
+        getSession().persist("Personaje",pers1);
+        getSession().persist(car1);
+        getSession().getTransaction().commit();
+        id_car1 = car1.getId();
+        id_pers1 = pers1.getId();
+
+        //REV 2
+        getSession().getTransaction().begin();
+        pers1.setAge(50);
+        getSession().persist("Personaje", pers1);
+        getSession().persist("Personaje", pers2);
+        getSession().persist(car2);
+        getSession().getTransaction().commit();
+        id_car2 = car2.getId();
+        id_pers2 = pers2.getId();
+
+    }
+    
+    @Test
+    public void testGetAssociationWithEntityNameAndNotAuditedMode() {
+    	// persons from "actual" model 
+    	Person person1 = (Person)getSession().get("Personaje", id_pers1);
+    	Person person2 = (Person)getSession().get("Personaje", id_pers2);
+    	
+    	Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+    	Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+    	
+    	// persons from "historic" model 
+    	Person person1_1 = car1.getOwner();
+    	Person person2_1 = car2.getOwner();
+    	
+    	assert(person1.getAge() == person1_1.getAge());
+    	assert(person2.getAge() == person2_1.getAge());
+    }
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,383 @@
+/*
+ * 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.components;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent1;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent2;
+import org.hibernate.envers.test.entities.components.DefaultValueComponentTestEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for components with default values.
+ * 
+ * @see <a
+ *      href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-5288">
+ *      Hibernate JIRA </a>
+ * 
+ * @author Erik-Berndt Scheper
+ */
+public class DefaultValueComponents extends AbstractEntityTest {
+	private static final Logger log = LoggerFactory
+			.getLogger(DefaultValueComponents.class);
+
+	private Integer id0;
+	private Integer id1;
+	private Integer id2;
+	private Integer id3;
+	private Integer id4;
+	private Integer id5;
+	private Integer id6;
+
+	public void configure(Ejb3Configuration cfg) {
+		cfg.addAnnotatedClass(DefaultValueComponentTestEntity.class);
+	}
+
+	@BeforeClass(dependsOnMethods = "init")
+	public void initData() {
+		// Revision 1
+		EntityManager em = getEntityManager();
+		em.getTransaction().begin();
+
+		DefaultValueComponentTestEntity cte0 = DefaultValueComponentTestEntity
+				.of(null);
+
+		DefaultValueComponentTestEntity cte1 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of("c1-str1", null));
+
+		DefaultValueComponentTestEntity cte2 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of("c1-str1", DefaultValueComponent2
+						.of("c2-str1", "c2-str2")));
+
+		DefaultValueComponentTestEntity cte3 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+						"c2-str1", "c2-str2")));
+
+		DefaultValueComponentTestEntity cte4 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+						null, "c2-str2")));
+
+		DefaultValueComponentTestEntity cte5 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+						"c2-str1", null)));
+
+		DefaultValueComponentTestEntity cte6 = DefaultValueComponentTestEntity
+				.of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+						null, null)));
+
+		em.persist(cte0);
+		em.persist(cte1);
+		em.persist(cte2);
+		em.persist(cte3);
+		em.persist(cte4);
+		em.persist(cte5);
+		em.persist(cte6);
+
+		em.getTransaction().commit();
+
+		// Revision 2
+		em = getEntityManager();
+		em.getTransaction().begin();
+
+		cte0 = em.find(DefaultValueComponentTestEntity.class, cte0.getId());
+		cte1 = em.find(DefaultValueComponentTestEntity.class, cte1.getId());
+		cte2 = em.find(DefaultValueComponentTestEntity.class, cte2.getId());
+		cte3 = em.find(DefaultValueComponentTestEntity.class, cte3.getId());
+		cte4 = em.find(DefaultValueComponentTestEntity.class, cte4.getId());
+		cte5 = em.find(DefaultValueComponentTestEntity.class, cte5.getId());
+		cte6 = em.find(DefaultValueComponentTestEntity.class, cte6.getId());
+
+		cte0.setComp1(DefaultValueComponent1.of("upd-c1-str1", null));
+		cte1.setComp1(DefaultValueComponent1.of(null, DefaultValueComponent2
+				.of("upd-c2-str1", "upd-c2-str2")));
+		cte2.getComp1().getComp2().setStr1("upd-c2-str1");
+		cte3.getComp1().getComp2().setStr1("upd-c2-str1");
+		cte4.getComp1().getComp2().setStr1("upd-c2-str1");
+		cte5.getComp1().getComp2().setStr1("upd-c2-str1");
+		cte6.getComp1().getComp2().setStr1("upd-c2-str1");
+
+		em.getTransaction().commit();
+
+		// afterwards
+		id0 = cte0.getId();
+		id1 = cte1.getId();
+		id2 = cte2.getId();
+		id3 = cte3.getId();
+		id4 = cte4.getId();
+		id5 = cte5.getId();
+		id6 = cte6.getId();
+	}
+
+	@Test
+	public void testRevisionsCounts() {
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id0).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id1).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id2).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id3).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id4).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id5).toString());
+		log.error(getAuditReader().getRevisions(
+				DefaultValueComponentTestEntity.class, id6).toString());
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id0));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id1));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id2));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id3));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id4));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id5));
+
+		assert Arrays.asList(1, 2).equals(
+				getAuditReader().getRevisions(
+						DefaultValueComponentTestEntity.class, id6));
+	}
+
+	@Test
+	public void testHistoryOfId0() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id0, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id0, 2);
+
+		log.error("------------ id0 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		checkCorrectlyPersisted(id0, null, null);
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id0, DefaultValueComponent1.of(null, null));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id0, DefaultValueComponent1.of("upd-c1-str1", null));
+
+		assert ent1.equals(expectedVer1);
+		assert ent2.equals(expectedVer2);
+	}
+
+	@Test
+	public void testHistoryOfId1() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id1, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id1, 2);
+
+		log.error("------------ id1 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		checkCorrectlyPersisted(id1, null, "upd-c2-str1");
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id1, DefaultValueComponent1.of("c1-str1", null));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id1, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("upd-c2-str1", "upd-c2-str2")));
+
+		assert ent2.equals(expectedVer2);
+		assert ent1.equals(expectedVer1);
+	}
+
+	@Test
+	public void testHistoryOfId2() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id2, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id2, 2);
+
+		log.error("------------ id2 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id2, DefaultValueComponent1.of("c1-str1",
+						DefaultValueComponent2.of("c2-str1", "c2-str2")));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id2, DefaultValueComponent1.of("c1-str1",
+						DefaultValueComponent2.of("upd-c2-str1", "c2-str2")));
+
+		assert ent1.equals(expectedVer1);
+		assert ent2.equals(expectedVer2);
+	}
+
+	@Test
+	public void testHistoryOfId3() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id3, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id3, 2);
+
+		log.error("------------ id3 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("c2-str1", "c2-str2")));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("upd-c2-str1", "c2-str2")));
+
+		assert ent1.equals(expectedVer1);
+		assert ent2.equals(expectedVer2);
+	}
+
+	@Test
+	public void testHistoryOfId4() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id4, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id4, 2);
+
+		log.error("------------ id4 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of(null, "c2-str2")));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("upd-c2-str1", "c2-str2")));
+
+		assert ent1.equals(expectedVer1);
+		assert ent2.equals(expectedVer2);
+	}
+
+	@Test
+	public void testHistoryOfId5() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id5, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id5, 2);
+
+		log.error("------------ id5 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("c2-str1", null)));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("upd-c2-str1", null)));
+
+		assert ent1.equals(expectedVer1);
+		assert ent2.equals(expectedVer2);
+	}
+
+	@Test
+	public void testHistoryOfId6() {
+
+		DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id6, 1);
+		DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+				DefaultValueComponentTestEntity.class, id6, 2);
+
+		log.error("------------ id6 -------------");
+		log.error(ent1.toString());
+		log.error(ent2.toString());
+
+		DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+				.of(id6, DefaultValueComponent1.of(null, null));
+		DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+				.of(id6, DefaultValueComponent1.of(null, DefaultValueComponent2
+						.of("upd-c2-str1", null)));
+
+		assert ent2.equals(expectedVer2);
+		assert ent1.equals(expectedVer1);
+	}
+
+	private void checkCorrectlyPersisted(Integer expectedId,
+			String expectedComp2Str1Rev1, String expectedComp2Str1Rev2) {
+		// Verify that the entity was correctly persisted
+		EntityManager em = getEntityManager();
+		em.getTransaction().begin();
+		Long entCount = (Long) em.createQuery(
+				"select count(s) from DefaultValueComponentTestEntity s where s.id = "
+						+ expectedId.toString()).getSingleResult();
+		BigInteger auditCount = (BigInteger) em.createNativeQuery(
+				"select count(ID) from DefaultValueComponentTestEntity_AUD s where s.id = "
+						+ expectedId.toString()).getSingleResult();
+		String comp2Str1Rev1 = (String) em
+				.createNativeQuery(
+						"select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=1 and s.id = "
+								+ expectedId.toString()).getSingleResult();
+		String comp2Str1Rev2 = (String) em
+				.createNativeQuery(
+						"select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=2 and s.id = "
+								+ expectedId.toString()).getSingleResult();
+		assert Long.valueOf(1L).equals(entCount);
+		assert BigInteger.valueOf(2L).equals(auditCount);
+
+		if (expectedComp2Str1Rev1 == null) {
+			assert comp2Str1Rev1 == null;
+		} else {
+			assert expectedComp2Str1Rev1.equals(comp2Str1Rev1);
+		}
+
+		if (expectedComp2Str1Rev2 == null) {
+			assert comp2Str1Rev2 == null;
+		} else {
+			assert expectedComp2Str1Rev2.equals(comp2Str1Rev2);
+		}
+		em.getTransaction().commit();
+	}
+}

Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,10 +27,7 @@
 import javax.persistence.EntityManager;
 
 import org.hibernate.envers.test.AbstractEntityTest;
-import org.hibernate.envers.test.entities.ids.EmbId;
-import org.hibernate.envers.test.entities.ids.EmbIdTestEntity;
-import org.hibernate.envers.test.entities.ids.MulId;
-import org.hibernate.envers.test.entities.ids.MulIdTestEntity;
+import org.hibernate.envers.test.entities.ids.*;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -44,10 +41,13 @@
     private EmbId id2;
     private MulId id3;
     private MulId id4;
+    private EmbIdWithCustomType id5;
+    private EmbIdWithCustomType id6;
 
     public void configure(Ejb3Configuration cfg) {
         cfg.addAnnotatedClass(EmbIdTestEntity.class);
         cfg.addAnnotatedClass(MulIdTestEntity.class);
+        cfg.addAnnotatedClass(EmbIdWithCustomTypeTestEntity.class);
     }
 
     @BeforeClass(dependsOnMethods = "init")
@@ -56,6 +56,8 @@
         id2 = new EmbId(10, 20);
         id3 = new MulId(100, 101);
         id4 = new MulId(102, 103);
+        id5 = new EmbIdWithCustomType(25, CustomEnum.NO);
+        id6 = new EmbIdWithCustomType(27, CustomEnum.YES);
 
         // Revision 1
         EntityManager em = getEntityManager();
@@ -63,6 +65,7 @@
 
         em.persist(new EmbIdTestEntity(id1, "x"));
         em.persist(new MulIdTestEntity(id3.getId1(), id3.getId2(), "a"));
+        em.persist(new EmbIdWithCustomTypeTestEntity(id5, "c"));
 
         em.getTransaction().commit();
 
@@ -72,6 +75,7 @@
 
         em.persist(new EmbIdTestEntity(id2, "y"));
         em.persist(new MulIdTestEntity(id4.getId1(), id4.getId2(), "b"));
+        em.persist(new EmbIdWithCustomTypeTestEntity(id6, "d"));
 
         em.getTransaction().commit();
 
@@ -83,11 +87,15 @@
         EmbIdTestEntity ete2 = em.find(EmbIdTestEntity.class, id2);
         MulIdTestEntity mte3 = em.find(MulIdTestEntity.class, id3);
         MulIdTestEntity mte4 = em.find(MulIdTestEntity.class, id4);
+        EmbIdWithCustomTypeTestEntity cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+        EmbIdWithCustomTypeTestEntity cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
 
         ete1.setStr1("x2");
         ete2.setStr1("y2");
         mte3.setStr1("a2");
         mte4.setStr1("b2");
+        cte5.setStr1("c2");
+        cte6.setStr1("d2");
 
         em.getTransaction().commit();
 
@@ -98,11 +106,15 @@
         ete1 = em.find(EmbIdTestEntity.class, id1);
         ete2 = em.find(EmbIdTestEntity.class, id2);
         mte3 = em.find(MulIdTestEntity.class, id3);
+        cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+        cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
 
         em.remove(ete1);
         em.remove(mte3);
+        em.remove(cte6);
 
         ete2.setStr1("y3");
+        cte5.setStr1("c3");
 
         em.getTransaction().commit();
 
@@ -126,6 +138,10 @@
         assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id3));
 
         assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id4));
+
+        assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id5));
+
+        assert Arrays.asList(2, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id6));
     }
 
     @Test
@@ -176,4 +192,29 @@
         assert getAuditReader().find(MulIdTestEntity.class, id4, 4).equals(ver2);
         assert getAuditReader().find(MulIdTestEntity.class, id4, 5).equals(ver2);
     }
+
+    @Test
+    public void testHistoryOfId5() {
+        EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id5, "c");
+        EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id5, "c2");
+        EmbIdWithCustomTypeTestEntity ver3 = new EmbIdWithCustomTypeTestEntity(id5, "c3");
+
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 1).equals(ver1);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 2).equals(ver1);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 3).equals(ver2);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 4).equals(ver3);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 5).equals(ver3);
+    }
+
+    @Test
+    public void testHistoryOfId6() {
+        EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id6, "d");
+        EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id6, "d2");
+
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 1) == null;
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 2).equals(ver1);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 3).equals(ver2);
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 4) == null;
+        assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 5) == null;
+    }
 }

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass extends DetailSuperclass {
+
+	private String str2;
+
+	public DetailSubclass() {
+
+	}
+
+	public String getStr2() {
+		return str2;
+	}
+
+	public void setStr2(String str2) {
+		this.str2 = str2;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+	private String str3;
+
+	public DetailSubclass2() {
+		
+	}
+
+	public String getStr3() {
+		return str3;
+	}
+
+	public void setStr3(String str3) {
+		this.str3 = str3;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,38 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSuperclass {
+
+	private long id;
+
+	private List<Master> masters;
+
+	public DetailSuperclass() {
+
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public List<Master> getMasters() {
+		return masters;
+	}
+
+	public void setMasters(List<Master> masters) {
+		this.masters = masters;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,114 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class ManyToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+	private long m1_id;
+
+	public void configure(Ejb3Configuration cfg) {
+		try {
+			URL url = Thread.currentThread().getContextClassLoader()
+					.getResource(
+							"mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml");
+			cfg.addFile(new File(url.toURI()));
+		} catch (URISyntaxException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@BeforeClass(dependsOnMethods = "init")
+	public void initData() {
+		EntityManager em = getEntityManager();
+
+		Master m1 = new Master();
+		DetailSubclass det1 = new DetailSubclass2();
+
+		// Revision 1
+		em.getTransaction().begin();
+
+		det1.setStr2("detail 1");
+
+		m1.setStr("master");
+		m1.setItems(new ArrayList<DetailSubclass>());
+		m1.getItems().add(det1);
+
+		det1.setMasters(new ArrayList<Master>());
+		det1.getMasters().add(m1);
+
+		em.persist(m1);
+		em.getTransaction().commit();
+		m1_id = m1.getId();
+
+		// Revision 2
+//		em.getTransaction().begin();
+//
+//		m1 = em.find(Master.class, m1_id);
+//
+//		det2.setStr2("detail 2");
+//		det2.setParent(m1);
+//		m1.getItems().add(det2);
+//		em.getTransaction().commit();
+//
+//		// Revision 3
+//		em.getTransaction().begin();
+//
+//		m1 = em.find(Master.class, m1_id);
+//		m1.setStr("new master");
+//
+//		det1 = m1.getItems().get(0);
+//		det1.setStr2("new detail");
+//		DetailSubclass det3 = new DetailSubclass2();
+//		det3.setStr2("detail 3");
+//		det3.setParent(m1);
+//
+//		m1.getItems().get(1).setParent(null);
+//		// m1.getItems().remove(1);
+//		m1.getItems().add(det3);
+//
+//		em.persist(m1);
+//		em.getTransaction().commit();
+//
+//		// Revision 4
+//		em.getTransaction().begin();
+//
+//		m1 = em.find(Master.class, m1_id);
+//
+//		det1 = m1.getItems().get(0);
+//		det1.setParent(null);
+//		// m1.getItems().remove(det1);
+//
+//		em.persist(m1);
+//		em.getTransaction().commit();
+
+	}
+
+	@Test
+	public void testHistoryExists() {
+		Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+		Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+		Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+		Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+		assert (rev1_1 != null);
+		assert (rev1_2 != null);
+		assert (rev1_3 != null);
+		assert (rev1_4 != null);
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class Master {
+
+	private long id;
+
+	private String str;
+
+	private List<DetailSubclass> items;
+
+	public Master() {
+
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getStr() {
+		return str;
+	}
+
+	public void setStr(String str) {
+		this.str = str;
+	}
+
+	public List<DetailSubclass> getItems() {
+		return items;
+	}
+
+	public void setItems(List<DetailSubclass> items) {
+		this.items = items;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass extends DetailSuperclass {
+
+	private String str2;
+
+	public DetailSubclass() {
+
+	}
+
+	public String getStr2() {
+		return str2;
+	}
+
+	public void setStr2(String str2) {
+		this.str2 = str2;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+	private String str3;
+
+	public DetailSubclass2() {
+		
+	}
+
+	public String getStr3() {
+		return str3;
+	}
+
+	public void setStr3(String str3) {
+		this.str3 = str3;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,36 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSuperclass {
+
+	private long id;
+
+	private Master parent;
+
+	public DetailSuperclass() {
+
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public Master getParent() {
+		return parent;
+	}
+
+	public void setParent(Master parent) {
+		this.parent = parent;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class Master {
+
+	private long id;
+
+	private String str;
+
+	private List<DetailSubclass> items;
+
+	public Master() {
+
+	}
+
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public String getStr() {
+		return str;
+	}
+
+	public void setStr(String str) {
+		this.str = str;
+	}
+
+	public List<DetailSubclass> getItems() {
+		return items;
+	}
+
+	public void setItems(List<DetailSubclass> items) {
+		this.items = items;
+	}
+
+}

Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,113 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ * 
+ */
+
+public class OneToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+	private long m1_id;
+
+	public void configure(Ejb3Configuration cfg) {
+		try {
+			URL url = Thread.currentThread().getContextClassLoader()
+					.getResource(
+							"mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml");
+			cfg.addFile(new File(url.toURI()));
+		} catch (URISyntaxException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	@BeforeClass(dependsOnMethods = "init")
+	public void initData() {
+		EntityManager em = getEntityManager();
+
+		Master m1 = new Master();
+		DetailSubclass det1 = new DetailSubclass2();
+		DetailSubclass det2 = new DetailSubclass2();
+
+		// Revision 1
+		em.getTransaction().begin();
+
+		det1.setStr2("detail 1");
+
+		m1.setStr("master");
+		m1.setItems(new ArrayList<DetailSubclass>());
+		m1.getItems().add(det1);
+		det1.setParent(m1);
+
+		em.persist(m1);
+		em.getTransaction().commit();
+		m1_id = m1.getId();
+
+		// Revision 2
+		em.getTransaction().begin();
+
+		m1 = em.find(Master.class, m1_id);
+
+		det2.setStr2("detail 2");
+		det2.setParent(m1);
+		m1.getItems().add(det2);
+		em.getTransaction().commit();
+
+		// Revision 3
+		em.getTransaction().begin();
+
+		m1 = em.find(Master.class, m1_id);
+		m1.setStr("new master");
+
+		det1 = m1.getItems().get(0);
+		det1.setStr2("new detail");
+		DetailSubclass det3 = new DetailSubclass2();
+		det3.setStr2("detail 3");
+		det3.setParent(m1);
+
+		m1.getItems().get(1).setParent(null);
+		// m1.getItems().remove(1);
+		m1.getItems().add(det3);
+
+		em.persist(m1);
+		em.getTransaction().commit();
+
+		// Revision 4
+		em.getTransaction().begin();
+
+		m1 = em.find(Master.class, m1_id);
+
+		det1 = m1.getItems().get(0);
+		det1.setParent(null);
+		// m1.getItems().remove(det1);
+
+		em.persist(m1);
+		em.getTransaction().commit();
+
+	}
+
+	@Test
+	public void testHistoryExists() {
+		Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+		Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+		Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+		Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+		assert (rev1_1 != null);
+		assert (rev1_2 != null);
+		assert (rev1_3 != null);
+		assert (rev1_4 != null);
+	}
+
+}

Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java	2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,15 @@
         StrTestEntity te = new StrTestEntity("x");
         em.persist(te);
         em.getTransaction().commit();
+    }
 
+    @Test(dependsOnMethods = "testTransactionRollback")
+    public void testDataNotPersisted() {
 		// Checking if the entity became persisted
-		em = getEntityManager();
+		EntityManager em = getEntityManager();
         em.getTransaction().begin();
         Long count = (Long) em.createQuery("select count(s) from StrTestEntity s where s.str = 'x'").getSingleResult();
 		assert count == 0l;
         em.getTransaction().commit();
     }
-}
\ No newline at end of file
+}

Added: core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,46 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+        "-//Hibernate/Hibernate Configuration DTD//EN"
+        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+    <session-factory>
+        <property name="hbm2ddl.auto">create-drop</property>
+
+        <property name="show_sql">false</property>
+        <property name="format_sql">false</property>
+
+        <property name="dialect">org.hibernate.dialect.H2Dialect</property>
+        <property name="connection.url">jdbc:h2:mem:envers</property>
+        <property name="connection.driver_class">org.h2.Driver</property>
+        <property name="connection.username">sa</property>
+        <property name="connection.password"></property>
+
+        <!--<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</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>-->
+
+        <!--<property name="hibernate.jdbc.batch_size">100</property>-->
+
+        <event type="post-insert">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+        <event type="post-update">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+        <event type="post-delete">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+        <event type="pre-collection-update">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+        <event type="pre-collection-remove">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+        <event type="post-collection-recreate">
+            <listener class="org.hibernate.envers.event.AuditEventListener" />
+        </event>
+    </session-factory>
+</hibernate-configuration>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.auditedEntity.Person" entity-name="Personaje">
+		
+		<id name="id" column="ID_person" type="long" >
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255"
+			column="NAME" not-null="true" />
+			
+		<property name="age" type="int" column="AGE"/>
+			
+	</class>
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Person"
+		entity-name="Personaje">
+
+		<id name="id" column="ID_PERSON" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255" column="NAME"
+			not-null="true" />
+
+		<property name="age" type="int" column="AGE" />
+
+		<bag name="cars" inverse="true" table="PERSON_CAR" >
+			<key column="ID_CAR" />
+			<many-to-many
+				class="org.hibernate.envers.test.entityNames.manyToManyAudited.Car" column="ID_PERSON"/>
+		</bag>
+
+	</class>
+
+	<class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Car">
+
+		<id name="id" column="ID_CAR" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="number" type="int" not-null="true" />
+
+		<bag name="owners" cascade="all" table="PERSON_CAR" >
+			<key column="ID_PERSON" />
+			<many-to-many entity-name="Personaje" column="ID_CAR"/>
+		</bag>
+
+	</class>
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Person" entity-name="Personaje">
+		
+		<id name="id" column="ID_PERSON" type="long" >
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255"
+			column="NAME" not-null="true" />
+			
+		<property name="age" type="int" column="AGE"/>
+			
+	</class>
+	
+	<class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" >
+
+		<id name="id" column="ID_CAR" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="number" type="int" column="int" not-null="true" />
+
+		<bag name="owners" cascade="save-update">
+			<key column="ID_GARAGE" not-null="true" update="false" />
+			<one-to-many entity-name="Personaje"/>
+		</bag>
+		
+	</class>	
+	
+<!--	<class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Garage" >-->
+<!---->
+<!--		<id name="id" column="ID_GARAGE" type="long">-->
+<!--			<generator class="native" />-->
+<!--		</id>-->
+<!---->
+<!--		<property name="name" type="int" column="int" not-null="true" />-->
+<!---->
+<!--		<bag name="cars" cascade="save-update">-->
+<!--			<key column="ID_GARAGE" not-null="true" update="false" />-->
+<!--			<one-to-many class="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" />-->
+<!--		</bag>-->
+<!--		-->
+<!--	</class>		-->
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Person" entity-name="Personaje">
+		
+		<id name="id" column="ID_PERSON" type="long" >
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255"
+			column="NAME" not-null="true" />
+			
+		<property name="age" type="int" column="AGE"/>
+			
+	</class>
+	
+	<class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Car" >
+
+		<id name="id" column="ID_CAR" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="number" type="int" column="int" not-null="true" />
+
+		<bag name="owners" cascade="save-update">
+			<key column="ID_GARAGE" not-null="true" update="false" />
+			<one-to-many entity-name="Personaje"/>
+		</bag>
+		
+	</class>	
+	
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Person" entity-name="Personaje">
+		
+		<id name="id" column="ID_person" type="long" >
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255"
+			column="NAME" not-null="true" />
+			
+		<property name="age" type="int" column="AGE"/>
+			
+	</class>
+	
+	<class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Car" >
+
+		<id name="id" column="ID_BED" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="number" type="int" column="int" not-null="true" />
+
+		<many-to-one name="owner" entity-name="Personaje"/>
+		
+	</class>	
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Person" entity-name="Personaje">
+		
+		<id name="id" column="ID_person" type="long" >
+			<generator class="native" />
+		</id>
+
+		<property name="name" type="string" length="255"
+			column="NAME" not-null="true" />
+			
+		<property name="age" type="int" column="AGE"/>
+			
+	</class>
+	
+	<class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Car" >
+
+		<id name="id" column="ID_BED" type="long">
+			<generator class="native" />
+		</id>
+
+		<property name="number" type="int" column="int" not-null="true" />
+
+		<many-to-one name="owner" entity-name="Personaje"/>
+		
+	</class>	
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class
+		name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+		table="HIB_MASTER_ENTITY">
+
+		<id name="id" column="ID" type="long">
+			<generator class="increment" />
+		</id>
+
+		<property name="str" column="STR" />
+
+		<bag name="items" lazy="true" cascade="all" access="property" inverse="true"
+			table="HIB_MASTER_DETAIL">
+			<key column="ID_MASTER" />
+			<many-to-many
+				class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+				column="ID_DETAIL" />
+		</bag>
+	</class>
+
+
+	<class
+		name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSuperclass"
+		table="HIB_DETAIL_ENTITY" abstract="true">
+		<id name="id" column="ID" type="long">
+			<generator class="increment" />
+		</id>
+		<discriminator column="DISCRIMINATOR" type="string" />
+		
+		<bag name="masters" lazy="true" access="property" table="HIB_MASTER_DETAIL">
+			<key column="ID_DETAIL" />
+			<many-to-many
+				class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+				column="ID_MASTER" />
+		</bag>
+
+		<subclass
+			name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass"
+			discriminator-value="SUB">
+			<property name="str2" column="STR2" />
+
+			<subclass
+				name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+				discriminator-value="SUB2"
+				extends="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass">
+				<property name="str3" column="STR3" />
+
+			</subclass>
+
+		</subclass>
+	</class>
+
+
+</hibernate-mapping>

Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml	                        (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+	<class
+		name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master"
+		table="HIB_MASTER_ENTITY">
+
+		<id name="id" column="ID" type="long">
+			<generator class="increment" />
+		</id>
+
+		<property name="str" column="STR" />
+
+		<bag name="items" lazy="true" cascade="all" access="property"
+			inverse="true">
+			<key column="ID_MASTER" />
+			<one-to-many
+				class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2" />
+		</bag>
+	</class>
+
+
+	<class
+		name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSuperclass"
+		table="HIB_DETAIL_ENTITY" abstract="true">
+		<id name="id" column="ID" type="long">
+			<generator class="increment" />
+		</id>
+		<discriminator column="DISCRIMINATOR" type="string" />
+
+		<many-to-one name="parent" column="ID_MASTER" 
+			class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master" />
+
+		<subclass
+			name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass"
+			discriminator-value="SUB">
+			<property name="str2" column="STR2" />
+
+			<subclass
+				name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2"
+				discriminator-value="SUB2" extends="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass">
+				<property name="str3" column="STR3" />
+	
+			</subclass>
+
+		</subclass>
+	</class>
+
+
+</hibernate-mapping>

Modified: core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/testng.xml	2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/resources/testng.xml	2010-08-21 15:15:15 UTC (rev 20212)
@@ -41,8 +41,10 @@
             <package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.subclass" />
             <package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.joined" />
             <package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.union" />
+            <package name="org.hibernate.envers.test.integration.jta" />
             <package name="org.hibernate.envers.test.integration.manytomany" />
             <package name="org.hibernate.envers.test.integration.manytomany.biowned" />
+            <package name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass" />
             <package name="org.hibernate.envers.test.integration.manytomany.sametable" />
             <package name="org.hibernate.envers.test.integration.manytomany.ternary" />
             <package name="org.hibernate.envers.test.integration.manytomany.unidirectional" />
@@ -53,6 +55,7 @@
             <package name="org.hibernate.envers.test.integration.notinsertable.manytoone" />
             <package name="org.hibernate.envers.test.integration.onetomany" />
             <package name="org.hibernate.envers.test.integration.onetomany.detached" />
+            <package name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass" />
             <package name="org.hibernate.envers.test.integration.onetoone.bidirectional" />
             <package name="org.hibernate.envers.test.integration.onetoone.bidirectional.ids" />
             <package name="org.hibernate.envers.test.integration.onetoone.unidirectional" />
@@ -69,6 +72,13 @@
             <package name="org.hibernate.envers.test.integration.secondary.ids" />
             <package name="org.hibernate.envers.test.integration.serialization" />
             <package name="org.hibernate.envers.test.integration.superclass" />
+
+            <package name="org.hibernate.envers.test.entityNames.auditedEntity" />
+            <package name="org.hibernate.envers.test.entityNames.manyToManyAudited" />
+            <package name="org.hibernate.envers.test.entityNames.oneToManyAudited" />
+            <package name="org.hibernate.envers.test.entityNames.oneToManyNotAudited" />
+            <package name="org.hibernate.envers.test.entityNames.singleAssociatedAudited" />
+            <package name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited" />
         </packages>
     </test>
 </suite>



More information about the hibernate-commits mailing list