Java Mailing List Archive

http://www.gg3721.com/

Home » Hibernate Commits List »

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

hibernate-commits

2010-08-21


Author LoginPost Reply
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)
@@(protected) @@
  <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>
@@(protected) @@
    <version>3.4.GA</version>
        <scope>test</scope>
     </dependency>
+    
  </dependencies>

  <dependencyManagement>
@@(protected) @@
        <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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public interface AuditReader {
  /**
@@(protected) @@
   */
  <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.
@@(protected) @@
   */
  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)
@@(protected) @@
* @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);
@@(protected) @@
     }
  }

-  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());

@@(protected) @@

     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;
@@(protected) @@
     // 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;
@@(protected) @@
        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());
@@(protected) @@

        case TABLE_PER_CLASS:
          mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
-
-        addTablePerClassInheritancePersisterHack(mappingData.getFirst());
-
          break;

        default:
@@(protected) @@
     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)
@@(protected) @@
/**
* 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);
@@(protected) @@
   * 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>@(protected).
+   * table and the value of the <code>@(protected).
   */
  public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
                          Collection propertyValue, CompositeMapperBuilder currentMapper,
@@(protected) @@
             // 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) {
@@(protected) @@
     // 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;
@@(protected) @@
     return middleEntityXmlId;
  }

-   @SuppressWarnings({"unchecked"})
  private String getMappedBy(Collection collectionValue) {
     PersistentClass referencedClass = ((OneToMany) collectionValue.getElement()).getAssociatedClass();

@@(protected) @@
        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();

@@(protected) @@
             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();
@@(protected) @@
        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();
@@(protected) @@
             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)
@@(protected) @@
   * @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;
@@(protected) @@
     }

     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)
@@(protected) @@

/**
* @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;
@@(protected) @@
  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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntityInstantiator {
  private final AuditConfiguration verCfg;
@@(protected) @@
     // 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)
@@(protected) @@
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)
@@(protected) @@
     }
   }

-    // 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();
@@(protected) @@
   }
  }

-   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)
@@(protected) @@
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;
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class OneToOneNotOwningMapper implements PropertyMapper {
  private String owningReferencePropertyName;
@@(protected) @@
        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)
@@(protected) @@
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;
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class ToOneIdMapper implements PropertyMapper {
  private final IdMapper delegate;
@@(protected) @@
     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,
@@(protected) @@
        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)
@@(protected) @@

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;
@@(protected) @@
/**
* @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;
@@(protected) @@
  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,
@@(protected) @@
     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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditEventListener implements PostInsertEventListener, PostUpdateEventListener,
     PostDeleteEventListener, PreCollectionUpdateEventListener, PreCollectionRemoveEventListener,
@@(protected) @@
          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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditQueryCreator {
  private final AuditConfiguration auditCfg;
@@(protected) @@
     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.
@@(protected) @@
  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 {@(protected)>
+   * <li>type of the revision (an enum instance of class {@(protected)>.
+   * </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)
@@(protected) @@

/**
* @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;

@@(protected) @@

  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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
  private final Number revision;
@@(protected) @@
     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)
@@(protected) @@
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;
@@(protected) @@
     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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public class AuditReaderImpl implements AuditReaderImplementor {
  private final AuditConfiguration verCfg;
@@(protected) @@
     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!");
     }
@@(protected) @@
     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;
@@(protected) @@
     }

     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)
@@(protected) @@

/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class Tools {
  public static <K,V> Map<K,V> newHashMap() {
@@(protected) @@
     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;
   }
@@(protected) @@
   }


-    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) {
@@(protected) @@
     }

     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)
@@(protected) @@
     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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+/*
+ * 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
+ */
+@(protected)
+@(protected)
+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)
@@(protected) @@
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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+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)
@@(protected) @@
+/*
+ * 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)
@@(protected) @@
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;

@@(protected) @@
  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")
@@(protected) @@
     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();
@@(protected) @@

     em.persist(new EmbIdTestEntity(id1, "x"));
     em.persist(new MulIdTestEntity(id3.getId1(), id3.getId2(), "a"));
+     em.persist(new EmbIdWithCustomTypeTestEntity(id5, "c"));

     em.getTransaction().commit();

@@(protected) @@

     em.persist(new EmbIdTestEntity(id2, "y"));
     em.persist(new MulIdTestEntity(id4.getId1(), id4.getId2(), "b"));
+     em.persist(new EmbIdWithCustomTypeTestEntity(id6, "d"));

     em.getTransaction().commit();

@@(protected) @@
     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();

@@(protected) @@
     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();

@@(protected) @@
     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
@@(protected) @@
     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)
@@(protected) @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+@(protected)
+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)
@@(protected) @@
+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)
@@(protected) @@
     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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
+<?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)
@@(protected) @@
        <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" />
@@(protected) @@
        <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" />
@@(protected) @@
        <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>

_______________________________________________
hibernate-commits mailing list
hibernate-commits@(protected)
https://lists.jboss.org/mailman/listinfo/hibernate-commits
©2008 gg3721.com - Jax Systems, LLC, U.S.A.