[hibernate-commits] Hibernate SVN: r20212 - in core/branches/envers-hibernate-3.3: src/main/java/org/hibernate/envers and 40 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Sat Aug 21 11:15:17 EDT 2010
Author: adamw
Date: 2010-08-21 11:15:15 -0400 (Sat, 21 Aug 2010)
New Revision: 20212
Added:
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/
core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
Modified:
core/branches/envers-hibernate-3.3/pom.xml
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
Log:
Backported changes from 3.5 to 3.3 by Hernan Chanfreau (thanks!)
List of issues:
HHH-4716: NotAuditedException using the entity name concept of hibernate.
HHH-5288: Envers auditReader.find() returns wrong data for embedded components using fields with default values
HHH-3957: Audited Null Embeddable objects not returned as null
HHH-5191: CollectionMetadataGenerator fails to obtain mappedBy attribute when is defined on superclasses
HHH-4899: Type not supported: org.hibernate.type.TimestampType
HHH-4928: Non-Audited Entity with @ManyToOne in PK causes error in Envers 1.2.2
HHH-4731: Public API to know if an entity class is audited
HHH-4900: Wrong immutable type check in IdMetadataGenerator
HHH-4792: Validate fix for HHH-4791
HHH-4693: MapProxy - problems during marshalling/demarchalling
HHH-4793: Revert disabling of VersionsJoinTableRangeComponentNamingTest and fix underlying issue
HHH-4063: NPE reading metadata from an mapped interface
Modified: core/branches/envers-hibernate-3.3/pom.xml
===================================================================
--- core/branches/envers-hibernate-3.3/pom.xml 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/pom.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -7,7 +7,7 @@
<parent>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-parent</artifactId>
- <version>3.5.0-SNAPSHOT</version>
+ <version>3.5.3-Final</version>
</parent>
<groupId>org.jboss.envers</groupId>
@@ -125,6 +125,7 @@
<version>3.4.GA</version>
<scope>test</scope>
</dependency>
+
</dependencies>
<dependencyManagement>
@@ -132,7 +133,7 @@
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
- <version>3.3.1.GA</version>
+ <version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/AuditReader.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,7 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public interface AuditReader {
/**
@@ -49,6 +49,23 @@
*/
<T> T find(Class<T> cls, Object primaryKey, Number revision) throws
IllegalArgumentException, NotAuditedException, IllegalStateException;
+
+ /**
+ * Find an entity by primary key at the given revision with the specified entityName.
+ * @param cls Class of the entity.
+ * @param entityName EntityName to find.
+ * @param primaryKey Primary key of the entity.
+ * @param revision Revision in which to get the entity.
+ * @return The found entity instance at the given revision (its properties may be partially filled
+ * if not all properties are audited) or null, if an entity with that id didn't exist at that
+ * revision.
+ * @throws IllegalArgumentException If cls or primaryKey is null or revision is less or equal to 0.
+ * @throws NotAuditedException When entities of the given class are not audited.
+ * @throws IllegalStateException If the associated entity manager is closed.
+ */
+ <T> T find(Class<T> cls, String entityName, Object primaryKey,
+ Number revision) throws IllegalArgumentException,
+ NotAuditedException, IllegalStateException;
/**
* Get a list of revision numbers, at which an entity was modified.
@@ -62,6 +79,21 @@
*/
List<Number> getRevisions(Class<?> cls, Object primaryKey)
throws IllegalArgumentException, NotAuditedException, IllegalStateException;
+
+ /**
+ * Get a list of revision numbers, at which an entity was modified, looking by entityName.
+ * @param cls Class of the entity.
+ * @param entityName EntityName to find.
+ * @param primaryKey Primary key of the entity.
+ * @return A list of revision numbers, at which the entity was modified, sorted in ascending order (so older
+ * revisions come first).
+ * @throws NotAuditedException When entities of the given class are not audited.
+ * @throws IllegalArgumentException If cls or primaryKey is null.
+ * @throws IllegalStateException If the associated entity manager is closed.
+ */
+ List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
+ throws IllegalArgumentException, NotAuditedException,
+ IllegalStateException;
/**
* Get the date, at which a revision was created.
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/AuditMetadataGenerator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -53,6 +53,7 @@
* @author Adam Warski (adam at warski dot org)
* @author Sebastian Komander
* @author Tomasz Bech
+ * @author Hern�n Chanfreau
*/
public final class AuditMetadataGenerator {
private static final Logger log = LoggerFactory.getLogger(AuditMetadataGenerator.class);
@@ -285,53 +286,21 @@
}
}
- private void addSingleInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversSingleTableEntityPersister");
- }
-
- private void addJoinedInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversJoinedSubclassEntityPersister");
- }
-
- private void addTablePerClassInheritancePersisterHack(Element class_mapping) {
- class_mapping.addAttribute("persister", "org.hibernate.envers.entity.EnversUnionSubclassEntityPersister");
- }
-
@SuppressWarnings({"unchecked"})
private Triple<Element, ExtendedPropertyMapper, String> generateMappingData(
PersistentClass pc, EntityXmlMappingData xmlMappingData, AuditTableData auditTableData,
IdMappingData idMapper) {
- boolean hasDiscriminator = pc.getDiscriminator() != null;
-
Element class_mapping = MetadataTools.createEntity(xmlMappingData.getMainXmlMapping(), auditTableData,
- hasDiscriminator ? pc.getDiscriminatorValue() : null);
+ pc.getDiscriminatorValue());
ExtendedPropertyMapper propertyMapper = new MultiPropertyMapper();
// Checking if there is a discriminator column
- if (hasDiscriminator) {
+ if (pc.getDiscriminator() != null) {
Element discriminator_element = class_mapping.addElement("discriminator");
MetadataTools.addColumns(discriminator_element, pc.getDiscriminator().getColumnIterator());
discriminator_element.addAttribute("type", pc.getDiscriminator().getType().getName());
}
- InheritanceType parentInheritance = InheritanceType.getForParent(pc);
- switch (parentInheritance) {
- case NONE:
- break;
-
- case SINGLE:
- addSingleInheritancePersisterHack(class_mapping);
- break;
-
- case JOINED:
- addJoinedInheritancePersisterHack(class_mapping);
- break;
-
- case TABLE_PER_CLASS:
- addTablePerClassInheritancePersisterHack(class_mapping);
- break;
- }
-
// Adding the id mapping
class_mapping.add((Element) idMapper.getXmlMapping().clone());
@@ -385,7 +354,7 @@
ExtendedPropertyMapper propertyMapper = null;
String parentEntityName = null;
- EntityConfiguration entityCfg = new EntityConfiguration(entityName, idMapper, propertyMapper,
+ EntityConfiguration entityCfg = new EntityConfiguration(entityName, pc.getClassName(), idMapper, propertyMapper,
parentEntityName);
notAuditedEntitiesConfigurations.put(entityName, entityCfg);
return;
@@ -405,7 +374,7 @@
// Generating a mapping for the id
IdMappingData idMapper = idMetadataGenerator.addId(pc, true);
- InheritanceType inheritanceType = InheritanceType.getForChild(pc);
+ InheritanceType inheritanceType = InheritanceType.get(pc);
// These properties will be read from the mapping data
final Element class_mapping;
@@ -427,8 +396,6 @@
case JOINED:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "joined-subclass");
- addJoinedInheritancePersisterHack(mappingData.getFirst());
-
// Adding the "key" element with all id columns...
Element keyMapping = mappingData.getFirst().addElement("key");
MetadataTools.addColumns(keyMapping, pc.getTable().getPrimaryKey().columnIterator());
@@ -439,9 +406,6 @@
case TABLE_PER_CLASS:
mappingData = generateInheritanceMappingData(pc, xmlMappingData, auditTableData, "union-subclass");
-
- addTablePerClassInheritancePersisterHack(mappingData.getFirst());
-
break;
default:
@@ -464,7 +428,7 @@
addJoins(pc, propertyMapper, auditingData, pc.getEntityName(), xmlMappingData, true);
// Storing the generated configuration
- EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName, idMapper,
+ EntityConfiguration entityCfg = new EntityConfiguration(auditEntityName,pc.getClassName(), idMapper,
propertyMapper, parentEntityName);
entitiesConfigurations.put(pc.getEntityName(), entityCfg);
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/CollectionMetadataGenerator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -80,6 +80,7 @@
/**
* Generates metadata for a collection-valued property.
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public final class CollectionMetadataGenerator {
private static final Logger log = LoggerFactory.getLogger(CollectionMetadataGenerator.class);
@@ -108,7 +109,7 @@
* be created using this object.
* @param propertyAuditingData Property auditing (meta-)data. Among other things, holds the name of the
* property that references the collection in the referencing entity, the user data for middle (join)
- * table and the value of the <code>@MapKey</code> annotation, if there was one.
+ * table and the value of the <code>@MapKey</code> annotation, if there was one.
*/
public CollectionMetadataGenerator(AuditMetadataGenerator mainGenerator,
Collection propertyValue, CompositeMapperBuilder currentMapper,
@@ -208,7 +209,7 @@
// The mapper will only be used to map from entity to map, so no need to provide other details
// when constructing the PropertyData.
new PropertyData(auditMappedBy, null, null, null),
- referencedEntityName, false);
+ referencingEntityName, false);
// Checking if there's an index defined. If so, adding a mapper for it.
if (propertyAuditingData.getPositionMappedBy() != null) {
@@ -286,13 +287,13 @@
// Generating the XML mapping for the middle entity, only if the relation isn't inverse.
// If the relation is inverse, will be later checked by comparing middleEntityXml with null.
Element middleEntityXml;
- if (!propertyValue.isInverse()) {
+ if (!propertyValue.isInverse()) {
// Generating a unique middle entity name
auditMiddleEntityName = mainGenerator.getAuditEntityNameRegister().createUnique(auditMiddleEntityName);
// Registering the generated name
mainGenerator.getAuditEntityNameRegister().register(auditMiddleEntityName);
-
+
middleEntityXml = createMiddleEntityXml(auditMiddleTableName, auditMiddleEntityName, propertyValue.getWhere());
} else {
middleEntityXml = null;
@@ -533,7 +534,6 @@
return middleEntityXmlId;
}
- @SuppressWarnings({"unchecked"})
private String getMappedBy(Collection collectionValue) {
PersistentClass referencedClass = ((OneToMany) collectionValue.getElement()).getAssociatedClass();
@@ -543,8 +543,31 @@
return auditMappedBy;
}
+ // searching in referenced class
+ String mappedBy = this.searchMappedBy(referencedClass, collectionValue);
+
+ if(mappedBy == null) {
+ log.debug("Going to search the mapped by attribute for " + propertyName + " in superclasses of entity: " + referencedClass.getClassName());
+
+ PersistentClass tempClass = referencedClass;
+ while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+ log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+ mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionValue);
+ tempClass = tempClass.getSuperclass();
+ }
+ }
+
+ if(mappedBy == null) {
+ throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+ + referencedClass.getClassName() + "!");
+ }
+
+ return mappedBy;
+ }
+
+ @SuppressWarnings({"unchecked"})
+ private String searchMappedBy(PersistentClass referencedClass, Collection collectionValue) {
Iterator<Property> assocClassProps = referencedClass.getPropertyIterator();
-
while (assocClassProps.hasNext()) {
Property property = assocClassProps.next();
@@ -552,13 +575,10 @@
collectionValue.getKey().getColumnIterator())) {
return property.getName();
}
- }
-
- throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
- + referencingEntityName + "!");
+ }
+ return null;
}
- @SuppressWarnings({"unchecked"})
private String getMappedBy(Table collectionTable, PersistentClass referencedClass) {
// If there's an @AuditMappedBy specified, returning it directly.
String auditMappedBy = propertyAuditingData.getAuditMappedBy();
@@ -566,6 +586,31 @@
return auditMappedBy;
}
+ // searching in referenced class
+ String mappedBy = this.searchMappedBy(referencedClass, collectionTable);
+
+ // not found on referenced class, searching on superclasses
+ if(mappedBy == null) {
+ log.debug("Going to search the mapped by attribute for " + propertyName + " in superclases of entity: " + referencedClass.getClassName());
+
+ PersistentClass tempClass = referencedClass;
+ while ((mappedBy == null) && (tempClass.getSuperclass() != null)) {
+ log.debug("Searching in superclass: " + tempClass.getSuperclass().getClassName());
+ mappedBy = this.searchMappedBy(tempClass.getSuperclass(), collectionTable);
+ tempClass = tempClass.getSuperclass();
+ }
+ }
+
+ if(mappedBy == null) {
+ throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
+ + referencedClass.getClassName() + "!");
+ }
+
+ return mappedBy;
+ }
+
+ @SuppressWarnings({"unchecked"})
+ private String searchMappedBy(PersistentClass referencedClass, Table collectionTable) {
Iterator<Property> properties = referencedClass.getPropertyIterator();
while (properties.hasNext()) {
Property property = properties.next();
@@ -576,9 +621,8 @@
return property.getName();
}
}
- }
-
- throw new MappingException("Unable to read the mapped by attribute for " + propertyName + " in "
- + referencingEntityName + "!");
+ }
+ return null;
}
+
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/configuration/metadata/InheritanceType.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -44,27 +44,16 @@
* @return The inheritance type of this class. NONE, if this class does not inherit from
* another persisten class.
*/
- public static InheritanceType getForChild(PersistentClass pc) {
+ public static InheritanceType get(PersistentClass pc) {
PersistentClass superclass = pc.getSuperclass();
if (superclass == null) {
return InheritanceType.NONE;
}
// We assume that every subclass is of the same type.
- return doGetForSubclass((Subclass) superclass.getSubclassIterator().next());
- }
+ Subclass subclass = (Subclass) superclass.getSubclassIterator().next();
- public static InheritanceType getForParent(PersistentClass pc) {
- if (!pc.getSubclassIterator().hasNext()) {
- return InheritanceType.NONE;
- }
-
- // We assume that every subclass is of the same type.
- return doGetForSubclass((Subclass) pc.getSubclassIterator().next());
- }
-
- private static InheritanceType doGetForSubclass(Subclass subclass) {
- if (subclass instanceof SingleTableSubclass) {
+ if (subclass instanceof SingleTableSubclass) {
return InheritanceType.SINGLE;
} else if (subclass instanceof JoinedSubclass) {
return InheritanceType.JOINED;
@@ -73,5 +62,5 @@
}
throw new MappingException("Unknown subclass class: " + subclass.getClass());
- }
+ }
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,18 +32,22 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntityConfiguration {
private String versionsEntityName;
- private IdMappingData idMappingData;
+ /** Holds the className for instantiation the configured entity */
+ private String entityClassName;
+ private IdMappingData idMappingData;
private ExtendedPropertyMapper propertyMapper;
// Maps from property name
private Map<String, RelationDescription> relations;
private String parentEntityName;
- public EntityConfiguration(String versionsEntityName, IdMappingData idMappingData,
+ public EntityConfiguration(String versionsEntityName, String entityClassName, IdMappingData idMappingData,
ExtendedPropertyMapper propertyMapper, String parentEntityName) {
this.versionsEntityName = versionsEntityName;
+ this.entityClassName = entityClassName;
this.idMappingData = idMappingData;
this.propertyMapper = propertyMapper;
this.parentEntityName = parentEntityName;
@@ -113,4 +117,11 @@
Iterable<RelationDescription> getRelationsIterator() {
return relations.values();
}
+
+ /**
+ * @return the className for the configured entity
+ */
+ public String getEntityClassName() {
+ return entityClassName;
+ }
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/EntityInstantiator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -36,6 +36,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntityInstantiator {
private final AuditConfiguration verCfg;
@@ -80,7 +81,13 @@
// If it is not in the cache, creating a new entity instance
Object ret;
try {
- Class<?> cls = ReflectionTools.loadClass(entityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(entityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(entityName);
+ }
+
+ Class<?> cls = ReflectionTools.loadClass(entCfg.getEntityClassName());
ret = ReflectHelper.getDefaultConstructor(cls).newInstance();
} catch (Exception e) {
throw new AuditException(e);
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -24,19 +24,19 @@
package org.hibernate.envers.entities.mapper;
import java.io.Serializable;
+import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.PropertyData;
-import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.reflection.ReflectionTools;
-
-import org.hibernate.collection.PersistentCollection;
import org.hibernate.property.Setter;
import org.hibernate.util.ReflectHelper;
-import org.hibernate.engine.SessionImplementor;
/**
* @author Adam Warski (adam at warski dot org)
@@ -84,8 +84,12 @@
}
}
- // And we don't have to set anything on the object - the default value is null
- if (!allNullAndSingle) {
+ if (allNullAndSingle) {
+ // single property, but default value need not be null, so we'll set it to null anyway
+ setter.set(obj, null, null);
+
+ } else {
+ // set the component
try {
Object subObj = ReflectHelper.getDefaultConstructor(
Thread.currentThread().getContextClassLoader().loadClass(componentClassName)).newInstance();
@@ -97,7 +101,7 @@
}
}
- public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
+ public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
PersistentCollection newColl,
Serializable oldColl,
Serializable id) {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/OneToOneNotOwningMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -31,6 +31,7 @@
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData;
import org.hibernate.envers.entities.mapper.PropertyMapper;
+import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.PropertyData;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.query.AuditEntity;
@@ -44,6 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class OneToOneNotOwningMapper implements PropertyMapper {
private String owningReferencePropertyName;
@@ -66,12 +68,18 @@
return;
}
- Class<?> entityClass = ReflectionTools.loadClass(owningEntityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(owningEntityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(owningEntityName);
+ }
+ Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
+
Object value;
try {
- value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, revision)
+ value = versionsReader.createQuery().forEntitiesAtRevision(entityClass, owningEntityName, revision)
.add(AuditEntity.relatedId(owningReferencePropertyName).eq(primaryKey)).getSingleResult();
} catch (NoResultException e) {
value = null;
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/ToOneIdMapper.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -33,6 +33,7 @@
import org.hibernate.envers.entities.mapper.PropertyMapper;
import org.hibernate.envers.entities.mapper.id.IdMapper;
import org.hibernate.envers.entities.mapper.relation.lazy.ToOneDelegateSessionImplementor;
+import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.PropertyData;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.Tools;
@@ -44,6 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class ToOneIdMapper implements PropertyMapper {
private final IdMapper delegate;
@@ -68,7 +70,7 @@
delegate.mapToMapFromEntity(newData, nonInsertableFake ? oldObj : newObj);
//noinspection SimplifiableConditionalExpression
- return nonInsertableFake ? false : !Tools.entitiesEqual(session, newObj, oldObj);
+ return nonInsertableFake ? false : !Tools.entitiesEqual(session, referencedEntityName, newObj, oldObj);
}
public void mapToEntityFromMap(AuditConfiguration verCfg, Object obj, Map data, Object primaryKey,
@@ -85,7 +87,13 @@
if (versionsReader.getFirstLevelCache().contains(referencedEntityName, revision, entityId)) {
value = versionsReader.getFirstLevelCache().get(referencedEntityName, revision, entityId);
} else {
- Class<?> entityClass = ReflectionTools.loadClass(referencedEntityName);
+ EntityConfiguration entCfg = verCfg.getEntCfg().get(referencedEntityName);
+ if(entCfg == null) {
+ // a relation marked as RelationTargetAuditMode.NOT_AUDITED
+ entCfg = verCfg.getEntCfg().getNotVersionEntityConfiguration(referencedEntityName);
+ }
+
+ Class<?> entityClass = ReflectionTools.loadClass(entCfg.getEntityClassName());
value = versionsReader.getSessionImplementor().getFactory().getEntityPersister(referencedEntityName).
createProxy((Serializable)entityId, new ToOneDelegateSessionImplementor(versionsReader, entityClass, entityId, revision, verCfg));
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/entities/mapper/relation/lazy/ToOneDelegateSessionImplementor.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,7 +27,6 @@
import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.EntitiesConfigurations;
-import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.HibernateException;
@@ -35,6 +34,7 @@
/**
* @author Adam Warski (adam at warski dot org)
* @author Tomasz Bech
+ * @author Hern�n Chanfreau
*/
public class ToOneDelegateSessionImplementor extends AbstractDelegateSessionImplementor {
private static final long serialVersionUID = 4770438372940785488L;
@@ -43,7 +43,7 @@
private final Class<?> entityClass;
private final Object entityId;
private final Number revision;
- private EntityConfiguration notVersionedEntityConfiguration;
+ private EntitiesConfigurations entCfg;
public ToOneDelegateSessionImplementor(AuditReaderImplementor versionsReader,
Class<?> entityClass, Object entityId, Number revision,
@@ -53,14 +53,15 @@
this.entityClass = entityClass;
this.entityId = entityId;
this.revision = revision;
- EntitiesConfigurations entCfg = verCfg.getEntCfg();
- notVersionedEntityConfiguration = entCfg.getNotVersionEntityConfiguration(entityClass.getName());
+ this.entCfg = verCfg.getEntCfg();
}
public Object doImmediateLoad(String entityName) throws HibernateException {
- if (notVersionedEntityConfiguration == null) {
- return versionsReader.find(entityClass, entityId, revision);
+ if(entCfg.getNotVersionEntityConfiguration(entityName) == null){
+ // audited relation, look up entity with envers
+ return versionsReader.find(entityClass, entityName, entityId, revision);
} else {
+ // notAudited relation, look up entity with hibernate
return delegate.immediateLoad(entityName, (Serializable) entityId);
}
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -61,6 +61,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditEventListener implements PostInsertEventListener, PostUpdateEventListener,
PostDeleteEventListener, PreCollectionUpdateEventListener, PreCollectionRemoveEventListener,
@@ -91,7 +92,7 @@
Object oldValue = oldState == null ? null : oldState[i];
Object newValue = newState == null ? null : newState[i];
- if (!Tools.entitiesEqual(session, oldValue, newValue)) {
+ if (!Tools.entitiesEqual(session, relDesc.getToEntityName(), oldValue, newValue)) {
// We have to generate changes both in the old collection (size decreses) and new collection
// (size increases).
if (newValue != null) {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/AuditQueryCreator.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class AuditQueryCreator {
private final AuditConfiguration auditCfg;
@@ -56,6 +57,22 @@
checkPositive(revision, "Entity revision");
return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, revision);
}
+
+ /**
+ * Creates a query, which will return entities satisfying some conditions (specified later),
+ * at a given revision and a given entityName.
+ * @param c Class of the entities for which to query.
+ * @param entityName EntityName of the entities for which to query.
+ * @param revision Revision number at which to execute the query.
+ * @return A query for entities at a given revision, to which conditions can be added and which
+ * can then be executed. The result of the query will be a list of entities (beans), unless a
+ * projection is added.
+ */
+ public AuditQuery forEntitiesAtRevision(Class<?> c, String entityName, Number revision) {
+ checkNotNull(revision, "Entity revision");
+ checkPositive(revision, "Entity revision");
+ return new EntitiesAtRevisionQuery(auditCfg, auditReaderImplementor, c, entityName, revision);
+ }
/**
* Creates a query, which selects the revisions, at which the given entity was modified.
@@ -80,4 +97,30 @@
public AuditQuery forRevisionsOfEntity(Class<?> c, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, selectEntitiesOnly,selectDeletedEntities);
}
+
+ /**
+ * Creates a query, which selects the revisions, at which the given entity was modified and with a given entityName.
+ * Unless an explicit projection is set, the result will be a list of three-element arrays, containing:
+ * <ol>
+ * <li>the entity instance</li>
+ * <li>revision entity, corresponding to the revision at which the entity was modified. If no custom
+ * revision entity is used, this will be an instance of {@link org.hibernate.envers.DefaultRevisionEntity}</li>
+ * <li>type of the revision (an enum instance of class {@link org.hibernate.envers.RevisionType})</li>.
+ * </ol>
+ * Additional conditions that the results must satisfy may be specified.
+ * @param c Class of the entities for which to query.
+ * @param entityName EntityName of the entities for which to query.
+ * @param selectEntitiesOnly If true, instead of a list of three-element arrays, a list of entites will be
+ * returned as a result of executing this query.
+ * @param selectDeletedEntities If true, also revisions where entities were deleted will be returned. The additional
+ * entities will have revision type "delete", and contain no data (all fields null), except for the id field.
+ * @return A query for revisions at which instances of the given entity were modified, to which
+ * conditions can be added (for example - a specific id of an entity of class <code>c</code>), and which
+ * can then be executed. The results of the query will be sorted in ascending order by the revision number,
+ * unless an order or projection is added.
+ */
+ public AuditQuery forRevisionsOfEntity(Class<?> c, String entityName, boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+ return new RevisionsOfEntityQuery(auditCfg, auditReaderImplementor, c, entityName, selectEntitiesOnly,selectDeletedEntities);
+ }
+
}
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/AbstractAuditQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,14 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public abstract class AbstractAuditQuery implements AuditQuery {
protected EntityInstantiator entityInstantiator;
protected List<AuditCriterion> criterions;
protected String entityName;
+ protected String entityClassName;
protected String versionsEntityName;
protected QueryBuilder qb;
@@ -66,18 +68,25 @@
protected AbstractAuditQuery(AuditConfiguration verCfg, AuditReaderImplementor versionsReader,
Class<?> cls) {
- this.verCfg = verCfg;
- this.versionsReader = versionsReader;
+ this(verCfg, versionsReader, cls, cls.getName());
+ }
- criterions = new ArrayList<AuditCriterion>();
- entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
+ protected AbstractAuditQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName) {
+ this.verCfg = verCfg;
+ this.versionsReader = versionsReader;
- entityName = cls.getName();
- versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(entityName);
+ criterions = new ArrayList<AuditCriterion>();
+ entityInstantiator = new EntityInstantiator(verCfg, versionsReader);
- qb = new QueryBuilder(versionsEntityName, "e");
- }
+ entityClassName = cls.getName();
+ this.entityName = entityName;
+ versionsEntityName = verCfg.getAuditEntCfg().getAuditEntityName(
+ entityName);
+ qb = new QueryBuilder(versionsEntityName, "e");
+ }
+
protected List buildAndExecuteQuery() {
StringBuilder querySb = new StringBuilder();
Map<String, Object> queryParamValues = new HashMap<String, Object>();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/EntitiesAtRevisionQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -35,6 +35,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class EntitiesAtRevisionQuery extends AbstractAuditQuery {
private final Number revision;
@@ -45,6 +46,12 @@
super(verCfg, versionsReader, cls);
this.revision = revision;
}
+
+ public EntitiesAtRevisionQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName, Number revision) {
+ super(verCfg, versionsReader, cls, entityName);
+ this.revision = revision;
+ }
@SuppressWarnings({"unchecked"})
public List list() {
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/query/impl/RevisionsOfEntityQuery.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -33,11 +33,11 @@
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.query.criteria.AuditCriterion;
import org.hibernate.envers.reader.AuditReaderImplementor;
-
import org.hibernate.proxy.HibernateProxy;
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class RevisionsOfEntityQuery extends AbstractAuditQuery {
private final boolean selectEntitiesOnly;
@@ -53,6 +53,15 @@
this.selectDeletedEntities = selectDeletedEntities;
}
+ public RevisionsOfEntityQuery(AuditConfiguration verCfg,
+ AuditReaderImplementor versionsReader, Class<?> cls, String entityName,
+ boolean selectEntitiesOnly, boolean selectDeletedEntities) {
+ super(verCfg, versionsReader, cls, entityName);
+
+ this.selectEntitiesOnly = selectEntitiesOnly;
+ this.selectDeletedEntities = selectDeletedEntities;
+ }
+
private Number getRevisionNumber(Map versionsEntity) {
AuditEntitiesConfiguration verEntCfg = verCfg.getAuditEntCfg();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/reader/AuditReaderImpl.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -45,7 +45,7 @@
/**
* @author Adam Warski (adam at warski dot org)
- * @author Hernan Chanfreau
+ * @author Hern�n Chanfreau
*/
public class AuditReaderImpl implements AuditReaderImplementor {
private final AuditConfiguration verCfg;
@@ -80,17 +80,22 @@
return firstLevelCache;
}
- @SuppressWarnings({"unchecked"})
public <T> T find(Class<T> cls, Object primaryKey, Number revision) throws
IllegalArgumentException, NotAuditedException, IllegalStateException {
+
+ return this.find(cls, cls.getName(), primaryKey, revision);
+ }
+
+ @SuppressWarnings({"unchecked"})
+ public <T> T find(Class<T> cls, String entityName, Object primaryKey, Number revision) throws
+ IllegalArgumentException, NotAuditedException, IllegalStateException {
checkNotNull(cls, "Entity class");
+ checkNotNull(entityName, "Entity name");
checkNotNull(primaryKey, "Primary key");
checkNotNull(revision, "Entity revision");
checkPositive(revision, "Entity revision");
checkSession();
- String entityName = cls.getName();
-
if (!verCfg.getEntCfg().isVersioned(entityName)) {
throw new NotAuditedException(entityName, entityName + " is not versioned!");
}
@@ -102,7 +107,7 @@
Object result;
try {
// The result is put into the cache by the entity instantiator called from the query
- result = createQuery().forEntitiesAtRevision(cls, revision)
+ result = createQuery().forEntitiesAtRevision(cls, entityName, revision)
.add(AuditEntity.id().eq(primaryKey)).getSingleResult();
} catch (NoResultException e) {
result = null;
@@ -111,23 +116,28 @@
}
return (T) result;
+ }
+
+ public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+ throws IllegalArgumentException, NotAuditedException, IllegalStateException {
+
+ return this.getRevisions(cls, cls.getName(), primaryKey);
}
@SuppressWarnings({"unchecked"})
- public List<Number> getRevisions(Class<?> cls, Object primaryKey)
+ public List<Number> getRevisions(Class<?> cls, String entityName, Object primaryKey)
throws IllegalArgumentException, NotAuditedException, IllegalStateException {
// todo: if a class is not versioned from the beginning, there's a missing ADD rev - what then?
checkNotNull(cls, "Entity class");
+ checkNotNull(entityName, "Entity name");
checkNotNull(primaryKey, "Primary key");
checkSession();
- String entityName = cls.getName();
-
if (!verCfg.getEntCfg().isVersioned(entityName)) {
throw new NotAuditedException(entityName, entityName + " is not versioned!");
}
- return createQuery().forRevisionsOfEntity(cls, false, true)
+ return createQuery().forRevisionsOfEntity(cls, entityName, false, true)
.addProjection(AuditEntity.revisionNumber())
.add(AuditEntity.id().eq(primaryKey))
.getResultList();
Modified: core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/main/java/org/hibernate/envers/tools/Tools.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -32,6 +32,7 @@
/**
* @author Adam Warski (adam at warski dot org)
+ * @author Hern�n Chanfreau
*/
public class Tools {
public static <K,V> Map<K,V> newHashMap() {
@@ -46,14 +47,14 @@
return new LinkedHashMap<K,V>();
}
- public static boolean entitiesEqual(SessionImplementor session, Object obj1, Object obj2) {
- Object id1 = getIdentifier(session, obj1);
- Object id2 = getIdentifier(session, obj2);
+ public static boolean entitiesEqual(SessionImplementor session, String entityName, Object obj1, Object obj2) {
+ Object id1 = getIdentifier(session, entityName, obj1);
+ Object id2 = getIdentifier(session, entityName, obj2);
return objectsEqual(id1, id2);
- }
+ }
- public static Object getIdentifier(SessionImplementor session, Object obj) {
+ public static Object getIdentifier(SessionImplementor session, String entityName, Object obj) {
if (obj == null) {
return null;
}
@@ -64,7 +65,7 @@
}
- return session.getEntityPersister(null, obj).getIdentifier(obj, session.getEntityMode());
+ return session.getEntityPersister(entityName, obj).getIdentifier(obj, session.getEntityMode());
}
public static Object getTargetFromProxy(SessionFactoryImplementor sessionFactoryImplementor, HibernateProxy proxy) {
@@ -73,12 +74,18 @@
}
SessionImplementor sessionImplementor = proxy.getHibernateLazyInitializer().getSession();
- Session tempSession = sessionImplementor==null ? sessionFactoryImplementor.openTemporarySession() : sessionImplementor.getFactory().openTemporarySession();
+ Session tempSession = sessionImplementor==null
+ ? sessionFactoryImplementor.openTemporarySession()
+ : sessionImplementor.getFactory().openTemporarySession();
try {
- proxy.getHibernateLazyInitializer().setSession((SessionImplementor) tempSession);
- proxy.getHibernateLazyInitializer().initialize();
- return proxy.getHibernateLazyInitializer().getImplementation();
- } finally {
+ Object target = tempSession.get(
+ proxy.getHibernateLazyInitializer().getEntityName(),
+ proxy.getHibernateLazyInitializer().getIdentifier()
+ );
+ proxy.getHibernateLazyInitializer().setImplementation( target );
+ return target;
+ }
+ finally {
tempSession.close();
}
}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractEntityTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -89,7 +89,12 @@
if (audited) {
initListeners();
}
+
cfg.configure("hibernate.test.cfg.xml");
+
+ // Separate database for each test class
+ cfg.setProperty("hibernate.connection.url", "jdbc:h2:mem:" + this.getClass().getName());
+
configure(cfg);
emf = cfg.buildEntityManagerFactory();
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/AbstractSessionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,79 @@
+package org.hibernate.envers.test;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.envers.AuditReader;
+import org.hibernate.envers.AuditReaderFactory;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+
+/**
+ * Base class for testing envers with Session.
+ *
+ * @author Hern�n Chanfreau
+ *
+ */
+public abstract class AbstractSessionTest {
+
+ protected Configuration config;
+ private SessionFactory sessionFactory;
+ private Session session ;
+ private AuditReader auditReader;
+
+
+ @BeforeClass
+ public void init() {
+ config = new AnnotationConfiguration();
+ try {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("hibernate.test.session-cfg.xml");
+ config.configure(new File(url.toURI()));
+ this.initMappings();
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ sessionFactory = config.buildSessionFactory();
+ }
+
+ protected abstract void initMappings() throws MappingException, URISyntaxException ;
+
+
+
+ private SessionFactory getSessionFactory(){
+ return sessionFactory;
+ }
+
+
+ @BeforeMethod
+ public void newSessionFactory() {
+ session = getSessionFactory().openSession();
+ auditReader = AuditReaderFactory.get(session);
+ }
+
+ @AfterClass
+ public void closeSessionFactory() {
+ sessionFactory.close();
+ }
+
+
+ protected Session getSession() {
+ return session;
+ }
+
+
+
+ protected AuditReader getAuditReader() {
+ return auditReader;
+ }
+
+}
+
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent1.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,68 @@
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.Embedded;
+
+/**
+ *
+ * @author Erik-Berndt Scheper
+ *
+ */
+public class DefaultValueComponent1 {
+
+ private String str1;
+
+ @Embedded
+ private DefaultValueComponent2 comp2 = new DefaultValueComponent2();
+
+ public static final DefaultValueComponent1 of(String str1,
+ DefaultValueComponent2 comp2) {
+ DefaultValueComponent1 instance = new DefaultValueComponent1();
+ instance.setStr1(str1);
+ instance.setComp2(comp2);
+ return instance;
+ }
+
+ public String getStr1() {
+ return str1;
+ }
+
+ public void setStr1(String str1) {
+ this.str1 = str1;
+ }
+
+ public DefaultValueComponent2 getComp2() {
+ return comp2;
+ }
+
+ public void setComp2(DefaultValueComponent2 comp2) {
+ this.comp2 = comp2;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponent1))
+ return false;
+
+ DefaultValueComponent1 that = (DefaultValueComponent1) o;
+
+ if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+ return false;
+ if (comp2 != null ? !comp2.equals(that.comp2) : that.comp2 != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (str1 != null ? str1.hashCode() : 0);
+ result = 31 * result + (comp2 != null ? comp2.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "Comp1(str1 = " + str1 + ", comp2 = " + comp2 + ")";
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponent2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,64 @@
+package org.hibernate.envers.test.entities.components;
+
+/**
+ *
+ * @author Erik-Berndt Scheper
+ *
+ */
+public class DefaultValueComponent2 {
+
+ private String str1 = "defaultValue";
+
+ private String str2;
+
+ public static final DefaultValueComponent2 of(String str1, String str2) {
+ DefaultValueComponent2 instance = new DefaultValueComponent2();
+ instance.setStr1(str1);
+ instance.setStr2(str2);
+ return instance;
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+ public String getStr1() {
+ return str1;
+ }
+
+ public void setStr1(String str1) {
+ this.str1 = str1;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponent2))
+ return false;
+
+ DefaultValueComponent2 that = (DefaultValueComponent2) o;
+
+ if (str1 != null ? !str1.equals(that.str1) : that.str1 != null)
+ return false;
+ if (str2 != null ? !str2.equals(that.str2) : that.str2 != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (str1 != null ? str1.hashCode() : 0);
+ result = 31 * result + (str2 != null ? str2.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "Comp2(str1 = " + str1 + ", str2 = " + str2 + ")";
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/components/DefaultValueComponentTestEntity.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,111 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.entities.components;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Erik-Berndt Scheper
+ */
+ at Entity
+ at Audited
+public class DefaultValueComponentTestEntity {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Embedded
+ @Audited
+ @AttributeOverrides( { @AttributeOverride(name = "comp2.str1", column = @Column(name = "COMP2_STR1")) })
+ private DefaultValueComponent1 comp1 = null;
+
+ public DefaultValueComponentTestEntity() {
+ }
+
+ public static DefaultValueComponentTestEntity of(
+ DefaultValueComponent1 comp1) {
+ DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+ instance.setComp1(comp1);
+ return instance;
+ }
+
+ public static DefaultValueComponentTestEntity of(Integer id,
+ DefaultValueComponent1 comp1) {
+ DefaultValueComponentTestEntity instance = new DefaultValueComponentTestEntity();
+ instance.setId(id);
+ instance.setComp1(comp1);
+ return instance;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public DefaultValueComponent1 getComp1() {
+ return comp1;
+ }
+
+ public void setComp1(DefaultValueComponent1 comp1) {
+ this.comp1 = comp1;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (!(o instanceof DefaultValueComponentTestEntity))
+ return false;
+
+ DefaultValueComponentTestEntity that = (DefaultValueComponentTestEntity) o;
+
+ if (comp1 != null ? !comp1.equals(that.comp1) : that.comp1 != null)
+ return false;
+ if (id != null ? !id.equals(that.id) : that.id != null)
+ return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (id != null ? id.hashCode() : 0);
+ result = 31 * result + (comp1 != null ? comp1.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "CTE(id = " + id + ", comp1 = " + comp1 + ")";
+ }
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entities/ids/EmbIdWithCustomType.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -37,7 +37,7 @@
public class EmbIdWithCustomType implements Serializable {
private Integer x;
- @Type(type = "customEnum")
+ @Type(type = "org.hibernate.envers.test.entities.ids.CustomEnumUserType")
private CustomEnum customEnum;
public EmbIdWithCustomType() {
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/auditedEntity/ReadEntityWhtiEntityNameTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.auditedEntity;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWhtiEntityNameTest extends AbstractSessionTest{
+
+ private long id_pers1;
+ private long id_pers2;
+ private long id_pers3;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/auditedEntity/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 30);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ id_pers1 = pers1.getId();
+ getSession().getTransaction().commit();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1 = (Person)getSession().get("Personaje", id_pers1);
+ pers1.setAge(29);
+ getSession().persist("Personaje",pers1);
+ getSession().persist("Personaje",pers2);
+ id_pers2 = pers2.getId();
+ getSession().getTransaction().commit();
+
+ //REV
+ getSession().getTransaction().begin();
+ pers1 = (Person)getSession().get("Personaje", id_pers1);
+ pers1.setName("Hernan David");
+ pers2 = (Person)getSession().get("Personaje", id_pers2);
+ pers2.setAge(30);
+ getSession().persist("Personaje",pers1);
+ getSession().persist("Personaje",pers2);
+ getSession().persist("Personaje",pers3);
+ id_pers3 = pers3.getId();
+ getSession().getTransaction().commit();
+
+ }
+
+
+ @Test
+ public void testRetrieveRevisionsWithEntityName() {
+ List<Number> pers1Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers1);
+ List<Number> pers2Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers2);
+ List<Number> pers3Revs = getAuditReader().getRevisions(Person.class,"Personaje", id_pers3);
+
+ assert(pers1Revs.size() == 3);
+ assert(pers2Revs.size() == 2);
+ assert(pers3Revs.size() == 1);
+ }
+
+ @Test
+ public void testRetrieveAuditedEntityWithEntityName() {
+ Person Person1 = getAuditReader().find(Person.class, "Personaje", id_pers1, 1);
+ Person Person2 = getAuditReader().find(Person.class, "Personaje", id_pers1, 2);
+ Person Person3 = getAuditReader().find(Person.class, "Personaje", id_pers1, 3);
+
+ System.out.println("Revision 1:");
+ System.out.println(" > Name: " + Person1.getName());
+ System.out.println(" > Age: " + Person1.getAge());
+ System.out.println("Revision 2:");
+ System.out.println(" > Name: " + Person2.getName());
+ System.out.println(" > Age: " + Person2.getAge());
+ System.out.println("Revision 3:");
+ System.out.println(" > Name: " + Person3.getName());
+ System.out.println(" > Age: " + Person3.getAge());
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,63 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ private List<Car> cars;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public List<Car> getCars() {
+ return cars;
+ }
+
+ public void setCars(List<Car> cars) {
+ this.cars = cars;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/manyToManyAudited/ReadEntityWithAuditedManyToManyTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,99 @@
+package org.hibernate.envers.test.entityNames.manyToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWithAuditedManyToManyTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/manyToManyAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ owners.add(pers3);
+ Car car1 = new Car(5, owners);
+
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers3);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainManyYoManyWithEntityName() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ System.out.println(" > Cars owned:");
+ for (Car ownedCar : owner.getCars()) {
+ System.out.println(" o Car: " + ownedCar.getNumber());
+ }
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ System.out.println(" > Cars owned:");
+ for (Car ownedCar : owner.getCars()) {
+ System.out.println(" o Car: " + ownedCar.getNumber());
+ }
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,89 @@
+package org.hibernate.envers.test.entityNames.oneToManyAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ Car car1 = new Car(5, owners);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainCollectionWithEntityName() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,58 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private List<Person> owners;
+
+
+ public Car() { }
+
+ public Car(int number, List<Person> owners) {
+ this.number = number;
+ this.owners = owners;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ @Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+ public List<Person> getOwners() {
+ return owners;
+ }
+
+ public void setOwners(List<Person> owners) {
+ this.owners = owners;
+ }
+
+ @Audited
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/oneToManyNotAudited/ReadEntityWithAuditedCollectionTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,84 @@
+package org.hibernate.envers.test.entityNames.oneToManyNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class ReadEntityWithAuditedCollectionTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 28);
+ Person pers2 = new Person("Leandro", 29);
+ Person pers3 = new Person("Barba", 32);
+ Person pers4 = new Person("Camomo", 15);
+
+ List<Person > owners = new ArrayList<Person>();
+ owners.add(pers1);
+ owners.add(pers2);
+ Car car1 = new Car(5, owners);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_pers1 = pers1.getId();
+ id_car1 = car1.getId();
+
+ owners = new ArrayList<Person>();
+ owners.add(pers2);
+ owners.add(pers4);
+ Car car2 = new Car(27, owners);
+ //REV 2
+ getSession().getTransaction().begin();
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ person1.setName("Hernan David");
+ person1.setAge(40);
+ getSession().persist(car1);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+
+ }
+
+ @Test
+ public void testObtainCollectionWithEntityNameAndNotAuditedMode() {
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ System.out.println(" > Car: " + car1.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car1.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ System.out.println(" > Car: " + car2.getNumber());
+ System.out.println(" > Owners:");
+ for (Person owner : car2.getOwners()) {
+ System.out.println(" > Name: " + owner.getName() + " - Age:" + owner.getAge());
+ }
+ }
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,54 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private Person owner;
+
+
+ public Car() { }
+
+ public Car(int number, Person owner) {
+ this.number = number;
+ this.owner = owner;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Person getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Person owner) {
+ this.owner = owner;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import org.hibernate.envers.Audited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+ at Audited
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedAudited/ReadEntityAssociatedAuditedTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,77 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityAssociatedAuditedTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+ private long id_pers2;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 15);
+ Person pers2 = new Person("Leandro", 19);
+
+ Car car1 = new Car(1, pers1);
+ Car car2 = new Car(2, pers2);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_car1 = car1.getId();
+ id_pers1 = pers1.getId();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1.setAge(50);
+ getSession().persist("Personaje", pers1);
+ getSession().persist("Personaje", pers2);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+ id_pers2 = pers2.getId();
+
+ }
+
+ @Test
+ public void testGetAssociationWithEntityName() {
+
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+ Person person1_1 = car1.getOwner();
+ assert(person1.getAge() != person1_1.getAge());
+
+ Person person2 = (Person)getSession().get("Personaje", id_pers2);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+ Person person2_1 = car2.getOwner();
+ assert(person2.getAge() == person2_1.getAge());
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Car.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,56 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import org.hibernate.envers.Audited;
+import org.hibernate.envers.RelationTargetAuditMode;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Car {
+
+ private long id;
+
+ private int number;
+
+ private Person owner;
+
+
+ public Car() { }
+
+ public Car(int number, Person owner) {
+ this.number = number;
+ this.owner = owner;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ @Audited(targetAuditMode=RelationTargetAuditMode.NOT_AUDITED)
+ public Person getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Person owner) {
+ this.owner = owner;
+ }
+
+ @Audited
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/Person.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class Person {
+
+ private long id;
+
+ private String name;
+
+ private int age;
+
+ public Person(){ }
+
+ public Person(String name, int age){
+ this.name = name;
+ this.age = age;
+ }
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/entityNames/singleAssociatedNotAudited/ReadEntityAssociatedNotAuditedTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,80 @@
+package org.hibernate.envers.test.entityNames.singleAssociatedNotAudited;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.hibernate.MappingException;
+import org.hibernate.envers.test.AbstractSessionTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ReadEntityAssociatedNotAuditedTest extends AbstractSessionTest{
+
+ private long id_car1;
+ private long id_car2;
+
+ private long id_pers1;
+ private long id_pers2;
+
+
+ protected void initMappings() throws MappingException, URISyntaxException {
+ URL url = Thread.currentThread().getContextClassLoader().getResource("mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml");
+ config.addFile(new File(url.toURI()));
+ }
+
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+
+ newSessionFactory();
+
+ Person pers1 = new Person("Hernan", 15);
+ Person pers2 = new Person("Leandro", 19);
+
+ Car car1 = new Car(1, pers1);
+ Car car2 = new Car(2, pers2);
+
+ //REV 1
+ getSession().getTransaction().begin();
+ getSession().persist("Personaje",pers1);
+ getSession().persist(car1);
+ getSession().getTransaction().commit();
+ id_car1 = car1.getId();
+ id_pers1 = pers1.getId();
+
+ //REV 2
+ getSession().getTransaction().begin();
+ pers1.setAge(50);
+ getSession().persist("Personaje", pers1);
+ getSession().persist("Personaje", pers2);
+ getSession().persist(car2);
+ getSession().getTransaction().commit();
+ id_car2 = car2.getId();
+ id_pers2 = pers2.getId();
+
+ }
+
+ @Test
+ public void testGetAssociationWithEntityNameAndNotAuditedMode() {
+ // persons from "actual" model
+ Person person1 = (Person)getSession().get("Personaje", id_pers1);
+ Person person2 = (Person)getSession().get("Personaje", id_pers2);
+
+ Car car1 = getAuditReader().find(Car.class, id_car1, 1);
+ Car car2 = getAuditReader().find(Car.class, id_car2, 2);
+
+ // persons from "historic" model
+ Person person1_1 = car1.getOwner();
+ Person person2_1 = car2.getOwner();
+
+ assert(person1.getAge() == person1_1.getAge());
+ assert(person2.getAge() == person2_1.getAge());
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/components/DefaultValueComponents.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,383 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors. All third-party contributions are
+ * distributed under license by Red Hat Middleware LLC.
+ *
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301 USA
+ */
+package org.hibernate.envers.test.integration.components;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent1;
+import org.hibernate.envers.test.entities.components.DefaultValueComponent2;
+import org.hibernate.envers.test.entities.components.DefaultValueComponentTestEntity;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Test class for components with default values.
+ *
+ * @see <a
+ * href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-5288">
+ * Hibernate JIRA </a>
+ *
+ * @author Erik-Berndt Scheper
+ */
+public class DefaultValueComponents extends AbstractEntityTest {
+ private static final Logger log = LoggerFactory
+ .getLogger(DefaultValueComponents.class);
+
+ private Integer id0;
+ private Integer id1;
+ private Integer id2;
+ private Integer id3;
+ private Integer id4;
+ private Integer id5;
+ private Integer id6;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(DefaultValueComponentTestEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ DefaultValueComponentTestEntity cte0 = DefaultValueComponentTestEntity
+ .of(null);
+
+ DefaultValueComponentTestEntity cte1 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of("c1-str1", null));
+
+ DefaultValueComponentTestEntity cte2 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of("c1-str1", DefaultValueComponent2
+ .of("c2-str1", "c2-str2")));
+
+ DefaultValueComponentTestEntity cte3 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ "c2-str1", "c2-str2")));
+
+ DefaultValueComponentTestEntity cte4 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ null, "c2-str2")));
+
+ DefaultValueComponentTestEntity cte5 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ "c2-str1", null)));
+
+ DefaultValueComponentTestEntity cte6 = DefaultValueComponentTestEntity
+ .of(DefaultValueComponent1.of(null, DefaultValueComponent2.of(
+ null, null)));
+
+ em.persist(cte0);
+ em.persist(cte1);
+ em.persist(cte2);
+ em.persist(cte3);
+ em.persist(cte4);
+ em.persist(cte5);
+ em.persist(cte6);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em = getEntityManager();
+ em.getTransaction().begin();
+
+ cte0 = em.find(DefaultValueComponentTestEntity.class, cte0.getId());
+ cte1 = em.find(DefaultValueComponentTestEntity.class, cte1.getId());
+ cte2 = em.find(DefaultValueComponentTestEntity.class, cte2.getId());
+ cte3 = em.find(DefaultValueComponentTestEntity.class, cte3.getId());
+ cte4 = em.find(DefaultValueComponentTestEntity.class, cte4.getId());
+ cte5 = em.find(DefaultValueComponentTestEntity.class, cte5.getId());
+ cte6 = em.find(DefaultValueComponentTestEntity.class, cte6.getId());
+
+ cte0.setComp1(DefaultValueComponent1.of("upd-c1-str1", null));
+ cte1.setComp1(DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "upd-c2-str2")));
+ cte2.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte3.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte4.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte5.getComp1().getComp2().setStr1("upd-c2-str1");
+ cte6.getComp1().getComp2().setStr1("upd-c2-str1");
+
+ em.getTransaction().commit();
+
+ // afterwards
+ id0 = cte0.getId();
+ id1 = cte1.getId();
+ id2 = cte2.getId();
+ id3 = cte3.getId();
+ id4 = cte4.getId();
+ id5 = cte5.getId();
+ id6 = cte6.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id0).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id1).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id2).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id3).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id4).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id5).toString());
+ log.error(getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id6).toString());
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id0));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id1));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id2));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id3));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id4));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id5));
+
+ assert Arrays.asList(1, 2).equals(
+ getAuditReader().getRevisions(
+ DefaultValueComponentTestEntity.class, id6));
+ }
+
+ @Test
+ public void testHistoryOfId0() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id0, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id0, 2);
+
+ log.error("------------ id0 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ checkCorrectlyPersisted(id0, null, null);
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id0, DefaultValueComponent1.of(null, null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id0, DefaultValueComponent1.of("upd-c1-str1", null));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId1() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id1, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id1, 2);
+
+ log.error("------------ id1 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ checkCorrectlyPersisted(id1, null, "upd-c2-str1");
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id1, DefaultValueComponent1.of("c1-str1", null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id1, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "upd-c2-str2")));
+
+ assert ent2.equals(expectedVer2);
+ assert ent1.equals(expectedVer1);
+ }
+
+ @Test
+ public void testHistoryOfId2() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id2, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id2, 2);
+
+ log.error("------------ id2 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id2, DefaultValueComponent1.of("c1-str1",
+ DefaultValueComponent2.of("c2-str1", "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id2, DefaultValueComponent1.of("c1-str1",
+ DefaultValueComponent2.of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId3() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id3, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id3, 2);
+
+ log.error("------------ id3 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("c2-str1", "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id3, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId4() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id4, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id4, 2);
+
+ log.error("------------ id4 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of(null, "c2-str2")));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id4, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", "c2-str2")));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId5() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id5, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id5, 2);
+
+ log.error("------------ id5 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("c2-str1", null)));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id5, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", null)));
+
+ assert ent1.equals(expectedVer1);
+ assert ent2.equals(expectedVer2);
+ }
+
+ @Test
+ public void testHistoryOfId6() {
+
+ DefaultValueComponentTestEntity ent1 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id6, 1);
+ DefaultValueComponentTestEntity ent2 = getAuditReader().find(
+ DefaultValueComponentTestEntity.class, id6, 2);
+
+ log.error("------------ id6 -------------");
+ log.error(ent1.toString());
+ log.error(ent2.toString());
+
+ DefaultValueComponentTestEntity expectedVer1 = DefaultValueComponentTestEntity
+ .of(id6, DefaultValueComponent1.of(null, null));
+ DefaultValueComponentTestEntity expectedVer2 = DefaultValueComponentTestEntity
+ .of(id6, DefaultValueComponent1.of(null, DefaultValueComponent2
+ .of("upd-c2-str1", null)));
+
+ assert ent2.equals(expectedVer2);
+ assert ent1.equals(expectedVer1);
+ }
+
+ private void checkCorrectlyPersisted(Integer expectedId,
+ String expectedComp2Str1Rev1, String expectedComp2Str1Rev2) {
+ // Verify that the entity was correctly persisted
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+ Long entCount = (Long) em.createQuery(
+ "select count(s) from DefaultValueComponentTestEntity s where s.id = "
+ + expectedId.toString()).getSingleResult();
+ BigInteger auditCount = (BigInteger) em.createNativeQuery(
+ "select count(ID) from DefaultValueComponentTestEntity_AUD s where s.id = "
+ + expectedId.toString()).getSingleResult();
+ String comp2Str1Rev1 = (String) em
+ .createNativeQuery(
+ "select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=1 and s.id = "
+ + expectedId.toString()).getSingleResult();
+ String comp2Str1Rev2 = (String) em
+ .createNativeQuery(
+ "select COMP2_STR1 from DefaultValueComponentTestEntity_AUD s where rev=2 and s.id = "
+ + expectedId.toString()).getSingleResult();
+ assert Long.valueOf(1L).equals(entCount);
+ assert BigInteger.valueOf(2L).equals(auditCount);
+
+ if (expectedComp2Str1Rev1 == null) {
+ assert comp2Str1Rev1 == null;
+ } else {
+ assert expectedComp2Str1Rev1.equals(comp2Str1Rev1);
+ }
+
+ if (expectedComp2Str1Rev2 == null) {
+ assert comp2Str1Rev2 == null;
+ } else {
+ assert expectedComp2Str1Rev2.equals(comp2Str1Rev2);
+ }
+ em.getTransaction().commit();
+ }
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/ids/CompositeIds.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -27,10 +27,7 @@
import javax.persistence.EntityManager;
import org.hibernate.envers.test.AbstractEntityTest;
-import org.hibernate.envers.test.entities.ids.EmbId;
-import org.hibernate.envers.test.entities.ids.EmbIdTestEntity;
-import org.hibernate.envers.test.entities.ids.MulId;
-import org.hibernate.envers.test.entities.ids.MulIdTestEntity;
+import org.hibernate.envers.test.entities.ids.*;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -44,10 +41,13 @@
private EmbId id2;
private MulId id3;
private MulId id4;
+ private EmbIdWithCustomType id5;
+ private EmbIdWithCustomType id6;
public void configure(Ejb3Configuration cfg) {
cfg.addAnnotatedClass(EmbIdTestEntity.class);
cfg.addAnnotatedClass(MulIdTestEntity.class);
+ cfg.addAnnotatedClass(EmbIdWithCustomTypeTestEntity.class);
}
@BeforeClass(dependsOnMethods = "init")
@@ -56,6 +56,8 @@
id2 = new EmbId(10, 20);
id3 = new MulId(100, 101);
id4 = new MulId(102, 103);
+ id5 = new EmbIdWithCustomType(25, CustomEnum.NO);
+ id6 = new EmbIdWithCustomType(27, CustomEnum.YES);
// Revision 1
EntityManager em = getEntityManager();
@@ -63,6 +65,7 @@
em.persist(new EmbIdTestEntity(id1, "x"));
em.persist(new MulIdTestEntity(id3.getId1(), id3.getId2(), "a"));
+ em.persist(new EmbIdWithCustomTypeTestEntity(id5, "c"));
em.getTransaction().commit();
@@ -72,6 +75,7 @@
em.persist(new EmbIdTestEntity(id2, "y"));
em.persist(new MulIdTestEntity(id4.getId1(), id4.getId2(), "b"));
+ em.persist(new EmbIdWithCustomTypeTestEntity(id6, "d"));
em.getTransaction().commit();
@@ -83,11 +87,15 @@
EmbIdTestEntity ete2 = em.find(EmbIdTestEntity.class, id2);
MulIdTestEntity mte3 = em.find(MulIdTestEntity.class, id3);
MulIdTestEntity mte4 = em.find(MulIdTestEntity.class, id4);
+ EmbIdWithCustomTypeTestEntity cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+ EmbIdWithCustomTypeTestEntity cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
ete1.setStr1("x2");
ete2.setStr1("y2");
mte3.setStr1("a2");
mte4.setStr1("b2");
+ cte5.setStr1("c2");
+ cte6.setStr1("d2");
em.getTransaction().commit();
@@ -98,11 +106,15 @@
ete1 = em.find(EmbIdTestEntity.class, id1);
ete2 = em.find(EmbIdTestEntity.class, id2);
mte3 = em.find(MulIdTestEntity.class, id3);
+ cte5 = em.find(EmbIdWithCustomTypeTestEntity.class, id5);
+ cte6 = em.find(EmbIdWithCustomTypeTestEntity.class, id6);
em.remove(ete1);
em.remove(mte3);
+ em.remove(cte6);
ete2.setStr1("y3");
+ cte5.setStr1("c3");
em.getTransaction().commit();
@@ -126,6 +138,10 @@
assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id3));
assert Arrays.asList(2, 3).equals(getAuditReader().getRevisions(MulIdTestEntity.class, id4));
+
+ assert Arrays.asList(1, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id5));
+
+ assert Arrays.asList(2, 3, 4).equals(getAuditReader().getRevisions(EmbIdWithCustomTypeTestEntity.class, id6));
}
@Test
@@ -176,4 +192,29 @@
assert getAuditReader().find(MulIdTestEntity.class, id4, 4).equals(ver2);
assert getAuditReader().find(MulIdTestEntity.class, id4, 5).equals(ver2);
}
+
+ @Test
+ public void testHistoryOfId5() {
+ EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id5, "c");
+ EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id5, "c2");
+ EmbIdWithCustomTypeTestEntity ver3 = new EmbIdWithCustomTypeTestEntity(id5, "c3");
+
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 1).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 2).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 3).equals(ver2);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 4).equals(ver3);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id5, 5).equals(ver3);
+ }
+
+ @Test
+ public void testHistoryOfId6() {
+ EmbIdWithCustomTypeTestEntity ver1 = new EmbIdWithCustomTypeTestEntity(id6, "d");
+ EmbIdWithCustomTypeTestEntity ver2 = new EmbIdWithCustomTypeTestEntity(id6, "d2");
+
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 1) == null;
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 2).equals(ver1);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 3).equals(ver2);
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 4) == null;
+ assert getAuditReader().find(EmbIdWithCustomTypeTestEntity.class, id6, 5) == null;
+ }
}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass extends DetailSuperclass {
+
+ private String str2;
+
+ public DetailSubclass() {
+
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSubclass2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+ private String str3;
+
+ public DetailSubclass2() {
+
+ }
+
+ public String getStr3() {
+ return str3;
+ }
+
+ public void setStr3(String str3) {
+ this.str3 = str3;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/DetailSuperclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,38 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSuperclass {
+
+ private long id;
+
+ private List<Master> masters;
+
+ public DetailSuperclass() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public List<Master> getMasters() {
+ return masters;
+ }
+
+ public void setMasters(List<Master> masters) {
+ this.masters = masters;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/ManyToManyInverseToSuperclassTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,114 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class ManyToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+ private long m1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ try {
+ URL url = Thread.currentThread().getContextClassLoader()
+ .getResource(
+ "mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml");
+ cfg.addFile(new File(url.toURI()));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ Master m1 = new Master();
+ DetailSubclass det1 = new DetailSubclass2();
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ det1.setStr2("detail 1");
+
+ m1.setStr("master");
+ m1.setItems(new ArrayList<DetailSubclass>());
+ m1.getItems().add(det1);
+
+ det1.setMasters(new ArrayList<Master>());
+ det1.getMasters().add(m1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+ m1_id = m1.getId();
+
+ // Revision 2
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+//
+// det2.setStr2("detail 2");
+// det2.setParent(m1);
+// m1.getItems().add(det2);
+// em.getTransaction().commit();
+//
+// // Revision 3
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+// m1.setStr("new master");
+//
+// det1 = m1.getItems().get(0);
+// det1.setStr2("new detail");
+// DetailSubclass det3 = new DetailSubclass2();
+// det3.setStr2("detail 3");
+// det3.setParent(m1);
+//
+// m1.getItems().get(1).setParent(null);
+// // m1.getItems().remove(1);
+// m1.getItems().add(det3);
+//
+// em.persist(m1);
+// em.getTransaction().commit();
+//
+// // Revision 4
+// em.getTransaction().begin();
+//
+// m1 = em.find(Master.class, m1_id);
+//
+// det1 = m1.getItems().get(0);
+// det1.setParent(null);
+// // m1.getItems().remove(det1);
+//
+// em.persist(m1);
+// em.getTransaction().commit();
+
+ }
+
+ @Test
+ public void testHistoryExists() {
+ Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+ Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+ Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+ Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+ assert (rev1_1 != null);
+ assert (rev1_2 != null);
+ assert (rev1_3 != null);
+ assert (rev1_4 != null);
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/manytomany/inverseToSuperclass/Master.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.manytomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class Master {
+
+ private long id;
+
+ private String str;
+
+ private List<DetailSubclass> items;
+
+ public Master() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public List<DetailSubclass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<DetailSubclass> items) {
+ this.items = items;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass extends DetailSuperclass {
+
+ private String str2;
+
+ public DetailSubclass() {
+
+ }
+
+ public String getStr2() {
+ return str2;
+ }
+
+ public void setStr2(String str2) {
+ this.str2 = str2;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSubclass2.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,26 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSubclass2 extends DetailSubclass {
+
+ private String str3;
+
+ public DetailSubclass2() {
+
+ }
+
+ public String getStr3() {
+ return str3;
+ }
+
+ public void setStr3(String str3) {
+ this.str3 = str3;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/DetailSuperclass.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,36 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class DetailSuperclass {
+
+ private long id;
+
+ private Master parent;
+
+ public DetailSuperclass() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Master getParent() {
+ return parent;
+ }
+
+ public void setParent(Master parent) {
+ this.parent = parent;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/Master.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+import java.util.List;
+
+import org.hibernate.envers.Audited;
+
+ at Audited
+public class Master {
+
+ private long id;
+
+ private String str;
+
+ private List<DetailSubclass> items;
+
+ public Master() {
+
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getStr() {
+ return str;
+ }
+
+ public void setStr(String str) {
+ this.str = str;
+ }
+
+ public List<DetailSubclass> getItems() {
+ return items;
+ }
+
+ public void setItems(List<DetailSubclass> items) {
+ this.items = items;
+ }
+
+}
Added: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/onetomany/inverseToSuperclass/OneToManyInverseToSuperclassTest.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,113 @@
+package org.hibernate.envers.test.integration.onetomany.inverseToSuperclass;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.envers.test.AbstractEntityTest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * @author Hern�n Chanfreau
+ *
+ */
+
+public class OneToManyInverseToSuperclassTest extends AbstractEntityTest {
+
+ private long m1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ try {
+ URL url = Thread.currentThread().getContextClassLoader()
+ .getResource(
+ "mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml");
+ cfg.addFile(new File(url.toURI()));
+ } catch (URISyntaxException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ Master m1 = new Master();
+ DetailSubclass det1 = new DetailSubclass2();
+ DetailSubclass det2 = new DetailSubclass2();
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ det1.setStr2("detail 1");
+
+ m1.setStr("master");
+ m1.setItems(new ArrayList<DetailSubclass>());
+ m1.getItems().add(det1);
+ det1.setParent(m1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+ m1_id = m1.getId();
+
+ // Revision 2
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+
+ det2.setStr2("detail 2");
+ det2.setParent(m1);
+ m1.getItems().add(det2);
+ em.getTransaction().commit();
+
+ // Revision 3
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+ m1.setStr("new master");
+
+ det1 = m1.getItems().get(0);
+ det1.setStr2("new detail");
+ DetailSubclass det3 = new DetailSubclass2();
+ det3.setStr2("detail 3");
+ det3.setParent(m1);
+
+ m1.getItems().get(1).setParent(null);
+ // m1.getItems().remove(1);
+ m1.getItems().add(det3);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+
+ // Revision 4
+ em.getTransaction().begin();
+
+ m1 = em.find(Master.class, m1_id);
+
+ det1 = m1.getItems().get(0);
+ det1.setParent(null);
+ // m1.getItems().remove(det1);
+
+ em.persist(m1);
+ em.getTransaction().commit();
+
+ }
+
+ @Test
+ public void testHistoryExists() {
+ Master rev1_1 = getAuditReader().find(Master.class, m1_id, 1);
+ Master rev1_2 = getAuditReader().find(Master.class, m1_id, 2);
+ Master rev1_3 = getAuditReader().find(Master.class, m1_id, 3);
+ Master rev1_4 = getAuditReader().find(Master.class, m1_id, 4);
+
+ assert (rev1_1 != null);
+ assert (rev1_2 != null);
+ assert (rev1_3 != null);
+ assert (rev1_4 != null);
+ }
+
+}
Modified: core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/java/org/hibernate/envers/test/integration/reventity/ExceptionListener.java 2010-08-21 15:15:15 UTC (rev 20212)
@@ -49,12 +49,15 @@
StrTestEntity te = new StrTestEntity("x");
em.persist(te);
em.getTransaction().commit();
+ }
+ @Test(dependsOnMethods = "testTransactionRollback")
+ public void testDataNotPersisted() {
// Checking if the entity became persisted
- em = getEntityManager();
+ EntityManager em = getEntityManager();
em.getTransaction().begin();
Long count = (Long) em.createQuery("select count(s) from StrTestEntity s where s.str = 'x'").getSingleResult();
assert count == 0l;
em.getTransaction().commit();
}
-}
\ No newline at end of file
+}
Added: core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/hibernate.test.session-cfg.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,46 @@
+<?xml version='1.0' encoding='utf-8'?>
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory>
+ <property name="hbm2ddl.auto">create-drop</property>
+
+ <property name="show_sql">false</property>
+ <property name="format_sql">false</property>
+
+ <property name="dialect">org.hibernate.dialect.H2Dialect</property>
+ <property name="connection.url">jdbc:h2:mem:envers</property>
+ <property name="connection.driver_class">org.h2.Driver</property>
+ <property name="connection.username">sa</property>
+ <property name="connection.password"></property>
+
+ <!--<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>-->
+ <!--<property name="connection.url">jdbc:mysql:///hibernate_tests?useUnicode=true&characterEncoding=UTF-8</property>-->
+ <!--<property name="connection.driver_class">com.mysql.jdbc.Driver</property>-->
+ <!--<property name="connection.username">root</property>-->
+ <!--<property name="connection.password"></property>-->
+
+ <!--<property name="hibernate.jdbc.batch_size">100</property>-->
+
+ <event type="post-insert">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-update">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-delete">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="pre-collection-update">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="pre-collection-remove">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ <event type="post-collection-recreate">
+ <listener class="org.hibernate.envers.event.AuditEventListener" />
+ </event>
+ </session-factory>
+</hibernate-configuration>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/auditedEntity/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.auditedEntity.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/manyToManyAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Person"
+ entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255" column="NAME"
+ not-null="true" />
+
+ <property name="age" type="int" column="AGE" />
+
+ <bag name="cars" inverse="true" table="PERSON_CAR" >
+ <key column="ID_CAR" />
+ <many-to-many
+ class="org.hibernate.envers.test.entityNames.manyToManyAudited.Car" column="ID_PERSON"/>
+ </bag>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.manyToManyAudited.Car">
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" not-null="true" />
+
+ <bag name="owners" cascade="all" table="PERSON_CAR" >
+ <key column="ID_PERSON" />
+ <many-to-many entity-name="Personaje" column="ID_CAR"/>
+ </bag>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" >
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <bag name="owners" cascade="save-update">
+ <key column="ID_GARAGE" not-null="true" update="false" />
+ <one-to-many entity-name="Personaje"/>
+ </bag>
+
+ </class>
+
+<!-- <class name="org.hibernate.envers.test.entityNames.oneToManyAudited.Garage" >-->
+<!---->
+<!-- <id name="id" column="ID_GARAGE" type="long">-->
+<!-- <generator class="native" />-->
+<!-- </id>-->
+<!---->
+<!-- <property name="name" type="int" column="int" not-null="true" />-->
+<!---->
+<!-- <bag name="cars" cascade="save-update">-->
+<!-- <key column="ID_GARAGE" not-null="true" update="false" />-->
+<!-- <one-to-many class="org.hibernate.envers.test.entityNames.oneToManyAudited.Car" />-->
+<!-- </bag>-->
+<!-- -->
+<!-- </class> -->
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/oneToManyNotAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_PERSON" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.oneToManyNotAudited.Car" >
+
+ <id name="id" column="ID_CAR" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <bag name="owners" cascade="save-update">
+ <key column="ID_GARAGE" not-null="true" update="false" />
+ <one-to-many entity-name="Personaje"/>
+ </bag>
+
+ </class>
+
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedAudited.Car" >
+
+ <id name="id" column="ID_BED" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <many-to-one name="owner" entity-name="Personaje"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/entityNames/singleAssociatedNotAudited/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Person" entity-name="Personaje">
+
+ <id name="id" column="ID_person" type="long" >
+ <generator class="native" />
+ </id>
+
+ <property name="name" type="string" length="255"
+ column="NAME" not-null="true" />
+
+ <property name="age" type="int" column="AGE"/>
+
+ </class>
+
+ <class name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited.Car" >
+
+ <id name="id" column="ID_BED" type="long">
+ <generator class="native" />
+ </id>
+
+ <property name="number" type="int" column="int" not-null="true" />
+
+ <many-to-one name="owner" entity-name="Personaje"/>
+
+ </class>
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/manyToMany/inverseToSuperclass/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+ table="HIB_MASTER_ENTITY">
+
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+
+ <property name="str" column="STR" />
+
+ <bag name="items" lazy="true" cascade="all" access="property" inverse="true"
+ table="HIB_MASTER_DETAIL">
+ <key column="ID_MASTER" />
+ <many-to-many
+ class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+ column="ID_DETAIL" />
+ </bag>
+ </class>
+
+
+ <class
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSuperclass"
+ table="HIB_DETAIL_ENTITY" abstract="true">
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+ <discriminator column="DISCRIMINATOR" type="string" />
+
+ <bag name="masters" lazy="true" access="property" table="HIB_MASTER_DETAIL">
+ <key column="ID_DETAIL" />
+ <many-to-many
+ class="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.Master"
+ column="ID_MASTER" />
+ </bag>
+
+ <subclass
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass"
+ discriminator-value="SUB">
+ <property name="str2" column="STR2" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass2"
+ discriminator-value="SUB2"
+ extends="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass.DetailSubclass">
+ <property name="str3" column="STR3" />
+
+ </subclass>
+
+ </subclass>
+ </class>
+
+
+</hibernate-mapping>
Added: core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml (rev 0)
+++ core/branches/envers-hibernate-3.3/src/test/resources/mappings/oneToMany/inverseToSuperclass/mappings.hbm.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="WINDOWS-1251"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<hibernate-mapping>
+
+ <class
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master"
+ table="HIB_MASTER_ENTITY">
+
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+
+ <property name="str" column="STR" />
+
+ <bag name="items" lazy="true" cascade="all" access="property"
+ inverse="true">
+ <key column="ID_MASTER" />
+ <one-to-many
+ class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2" />
+ </bag>
+ </class>
+
+
+ <class
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSuperclass"
+ table="HIB_DETAIL_ENTITY" abstract="true">
+ <id name="id" column="ID" type="long">
+ <generator class="increment" />
+ </id>
+ <discriminator column="DISCRIMINATOR" type="string" />
+
+ <many-to-one name="parent" column="ID_MASTER"
+ class="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.Master" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass"
+ discriminator-value="SUB">
+ <property name="str2" column="STR2" />
+
+ <subclass
+ name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass2"
+ discriminator-value="SUB2" extends="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass.DetailSubclass">
+ <property name="str3" column="STR3" />
+
+ </subclass>
+
+ </subclass>
+ </class>
+
+
+</hibernate-mapping>
Modified: core/branches/envers-hibernate-3.3/src/test/resources/testng.xml
===================================================================
--- core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2010-08-20 17:23:03 UTC (rev 20211)
+++ core/branches/envers-hibernate-3.3/src/test/resources/testng.xml 2010-08-21 15:15:15 UTC (rev 20212)
@@ -41,8 +41,10 @@
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.subclass" />
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.joined" />
<package name="org.hibernate.envers.test.integration.interfaces.hbm.propertiesAudited2.union" />
+ <package name="org.hibernate.envers.test.integration.jta" />
<package name="org.hibernate.envers.test.integration.manytomany" />
<package name="org.hibernate.envers.test.integration.manytomany.biowned" />
+ <package name="org.hibernate.envers.test.integration.manytomany.inverseToSuperclass" />
<package name="org.hibernate.envers.test.integration.manytomany.sametable" />
<package name="org.hibernate.envers.test.integration.manytomany.ternary" />
<package name="org.hibernate.envers.test.integration.manytomany.unidirectional" />
@@ -53,6 +55,7 @@
<package name="org.hibernate.envers.test.integration.notinsertable.manytoone" />
<package name="org.hibernate.envers.test.integration.onetomany" />
<package name="org.hibernate.envers.test.integration.onetomany.detached" />
+ <package name="org.hibernate.envers.test.integration.onetomany.inverseToSuperclass" />
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional" />
<package name="org.hibernate.envers.test.integration.onetoone.bidirectional.ids" />
<package name="org.hibernate.envers.test.integration.onetoone.unidirectional" />
@@ -69,6 +72,13 @@
<package name="org.hibernate.envers.test.integration.secondary.ids" />
<package name="org.hibernate.envers.test.integration.serialization" />
<package name="org.hibernate.envers.test.integration.superclass" />
+
+ <package name="org.hibernate.envers.test.entityNames.auditedEntity" />
+ <package name="org.hibernate.envers.test.entityNames.manyToManyAudited" />
+ <package name="org.hibernate.envers.test.entityNames.oneToManyAudited" />
+ <package name="org.hibernate.envers.test.entityNames.oneToManyNotAudited" />
+ <package name="org.hibernate.envers.test.entityNames.singleAssociatedAudited" />
+ <package name="org.hibernate.envers.test.entityNames.singleAssociatedNotAudited" />
</packages>
</test>
</suite>
More information about the hibernate-commits
mailing list