Author: adamw
Date: 2008-09-22 07:26:24 -0400 (Mon, 22 Sep 2008)
New Revision: 159
Added:
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java
Modified:
trunk/src/main/org/jboss/envers/VersionsJoinTable.java
trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java
trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java
trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java
trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java
trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java
Log:
ENVERS-26: support for @VersionsJoinTable, and unidirectional one-to-many associations
mapped with @OneToMany+@JoinColumn
Modified: trunk/src/main/org/jboss/envers/VersionsJoinTable.java
===================================================================
--- trunk/src/main/org/jboss/envers/VersionsJoinTable.java 2008-09-22 09:48:53 UTC (rev
158)
+++ trunk/src/main/org/jboss/envers/VersionsJoinTable.java 2008-09-22 11:26:24 UTC (rev
159)
@@ -50,8 +50,8 @@
String catalog() default "";
/**
- * @return The foreign key columns of the join table which reference the primary
table of the entity owning the
- * association (i.e. the owning side of the association).
+ * @return The foreign key columns of the join table which reference the primary
table of the entity that does not
+ * own the association (i.e. the inverse side of the association).
*/
- JoinColumn[] joinColumns() default {};
+ JoinColumn[] inverseJoinColumns() default {};
}
\ No newline at end of file
Modified: trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-09-22
09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/EntitiesConfigurator.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -28,6 +28,7 @@
import org.jboss.envers.configuration.metadata.EntityXmlMappingData;
import org.jboss.envers.tools.graph.GraphTopologicalSort;
import org.jboss.envers.tools.reflection.YReflectionManager;
+import org.jboss.envers.tools.StringTools;
import org.dom4j.io.DOMWriter;
import org.dom4j.io.XMLWriter;
import org.dom4j.io.OutputFormat;
@@ -75,8 +76,8 @@
if (versioningData.isVersioned()) {
pcDatas.put(pc, versioningData);
- if (versioningData.versionsTableName != null) {
- verEntCfg.addCustomVersionsTableName(pc.getEntityName(),
versioningData.versionsTableName);
+ if (!StringTools.isEmpty(versioningData.versionsTable.value())) {
+ verEntCfg.addCustomVersionsTableName(pc.getEntityName(),
versioningData.versionsTable.value());
}
EntityXmlMappingData xmlMappingData = new EntityXmlMappingData();
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/AnnotationsMetadataReader.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -31,6 +31,8 @@
import org.hibernate.mapping.PersistentClass;
import org.hibernate.MappingException;
+import java.lang.annotation.Annotation;
+
/**
* A helper class to read versioning meta-data from annotations on a persistent class.
* @author Adam Warski (adam at warski dot org)
@@ -117,9 +119,9 @@
private void addVersionsTable(YClass clazz) {
VersionsTable versionsTable = clazz.getAnnotation(VersionsTable.class);
if (versionsTable != null) {
- versioningData.versionsTableName = versionsTable.value();
- versioningData.schema = versionsTable.schema();
- versioningData.catalog = versionsTable.catalog();
+ versioningData.versionsTable = versionsTable;
+ } else {
+ versioningData.versionsTable = getDefaultVersionsTable();
}
}
@@ -158,4 +160,13 @@
return versioningData;
}
+
+ private VersionsTable getDefaultVersionsTable() {
+ return new VersionsTable() {
+ public String value() { return ""; }
+ public String schema() { return ""; }
+ public String catalog() { return ""; }
+ public Class<? extends Annotation> annotationType() { return
this.getClass(); }
+ };
+ }
}
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/BasicMetadataGenerator.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -108,7 +108,7 @@
while (properties.hasNext()) {
Property property = properties.next();
mainGenerator.addValue(component_mapping, property.getName(),
property.getValue(),
- componentMapper, ModificationStore.FULL, entityName, xmlMappingData,
firstPass);
+ componentMapper, ModificationStore.FULL, entityName, xmlMappingData,
null, firstPass);
}
}
}
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/CollectionMetadataGenerator.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -17,12 +17,15 @@
import org.jboss.envers.tools.Tools;
import org.jboss.envers.tools.StringTools;
import org.jboss.envers.ModificationStore;
+import org.jboss.envers.VersionsJoinTable;
import org.dom4j.Element;
+import javax.persistence.JoinColumn;
import java.util.*;
import java.util.Set;
import java.util.List;
import java.util.Map;
+import java.lang.annotation.Annotation;
/**
* Generates metadata for collection-valued properties.
@@ -36,17 +39,29 @@
}
void addCollection(String name, Collection value, CompositeMapperBuilder
currentMapper,
- String entityName, EntityXmlMappingData xmlMappingData) {
+ String entityName, EntityXmlMappingData xmlMappingData,
+ VersionsJoinTable joinTable) {
Type type = value.getType();
if ((type instanceof BagType || type instanceof SetType) &&
(value.getElement() instanceof OneToMany) && (value.isInverse()))
{
addOneToManyAttached(name, value, currentMapper, entityName);
} else {
- addWithMiddleTable(name, value, currentMapper, entityName, xmlMappingData);
+ addWithMiddleTable(name, value, currentMapper, entityName, xmlMappingData,
+ joinTable == null ? getDefaultVersionsJoinTable() : joinTable);
}
}
+ private VersionsJoinTable getDefaultVersionsJoinTable() {
+ return new VersionsJoinTable() {
+ public String name() { return ""; }
+ public String schema() { return ""; }
+ public String catalog() { return ""; }
+ public JoinColumn[] inverseJoinColumns() { return new JoinColumn[0]; }
+ public Class<? extends Annotation> annotationType() { return
this.getClass(); }
+ };
+ }
+
@SuppressWarnings({"unchecked"})
private String getMappedBy(Collection collectionValue) {
Iterator<Property> assocClassProps =
@@ -113,7 +128,7 @@
private String getReferencedEntityName(Value value) {
if (value instanceof ToOne) {
return ((ToOne) value).getReferencedEntityName();
- } if (value instanceof OneToMany) {
+ } else if (value instanceof OneToMany) {
return ((OneToMany) value).getReferencedEntityName();
} else {
return null;
@@ -121,9 +136,11 @@
}
@SuppressWarnings({"unchecked"})
- private void addRelatedToXmlMapping(Element xmlMapping, String prefix, Value
relatedValue, IdMappingData relatedIdMapping) {
+ private void addRelatedToXmlMapping(Element xmlMapping, String prefix,
+ MetadataTools.ColumnNameIterator
columnNameIterator,
+ IdMappingData relatedIdMapping) {
Element properties = (Element) relatedIdMapping.getXmlRelationMapping().clone();
- MetadataTools.prefixNamesInPropertyElement(properties, prefix,
relatedValue.getColumnIterator(), true);
+ MetadataTools.prefixNamesInPropertyElement(properties, prefix,
columnNameIterator, true);
for (Element idProperty : (java.util.List<Element>) properties.elements())
{
xmlMapping.add((Element) idProperty.clone());
}
@@ -131,10 +148,9 @@
private String getMiddleTableName(Collection value, String entityName) {
// We check how Hibernate maps the collection.
- if (value.getKey().getTable().equals(value.getCollectionTable())) {
- // The table of the element is the same as the collection table - this must
be a @JoinColumn+@OneToMany
- // mapping. Generating the table name ourselves, as Hibernate doesn't use
a middle table for mapping
- // this relation.
+ if (value.getElement() instanceof OneToMany && !value.isInverse()) {
+ // This must be a @JoinColumn+@OneToMany mapping. Generating the table name,
as Hibernate doesn't use a
+ // middle table for mapping this relation.
return StringTools.getLastComponent(entityName) + "_" +
StringTools.getLastComponent(getReferencedEntityName(value.getElement()));
} else {
// Hibernate uses a middle table for mapping this relation, so we get
it's name directly.
@@ -144,21 +160,28 @@
@SuppressWarnings({"unchecked"})
private void addWithMiddleTable(String name, Collection value, CompositeMapperBuilder
currentMapper,
- String entityName, EntityXmlMappingData
xmlMappingData) {
- // Generating the name of the middle table, its schema and catalog
- // TODO: add support for @VersionsJoinTable
- String middleTableName = getMiddleTableName(value,
entityName);//value.getCollectionTable().getName();
- String versionsMiddleTableName =
mainGenerator.getVerEntCfg().getVersionsTableName(null, middleTableName);
- String versionsMiddleEntityName =
mainGenerator.getVerEntCfg().getVersionsEntityName(middleTableName);
+ String entityName, EntityXmlMappingData
xmlMappingData, VersionsJoinTable joinTable) {
+ // Generating the name of the middle table
- String schema = value.getCollectionTable().getSchema();
- String catalog = value.getCollectionTable().getCatalog();
+ String versionsMiddleTableName;
+ String versionsMiddleEntityName;
+ if (!StringTools.isEmpty(joinTable.name())) {
+ versionsMiddleTableName = joinTable.name();
+ versionsMiddleEntityName = joinTable.name();
+ } else {
+ String middleTableName = getMiddleTableName(value, entityName);
+ versionsMiddleTableName =
mainGenerator.getVerEntCfg().getVersionsTableName(null, middleTableName);
+ versionsMiddleEntityName =
mainGenerator.getVerEntCfg().getVersionsEntityName(middleTableName);
+ }
// 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;
Element middleEntityXmlId;
if (!value.isInverse()) {
+ String schema = StringTools.isEmpty(joinTable.schema()) ?
value.getCollectionTable().getSchema() : joinTable.schema();
+ String catalog = StringTools.isEmpty(joinTable.catalog()) ?
value.getCollectionTable().getCatalog() : joinTable.catalog();
+
middleEntityXml =
MetadataTools.createEntity(xmlMappingData.newAdditionalMapping(),
versionsMiddleEntityName, versionsMiddleTableName, schema, catalog,
null);
middleEntityXmlId = middleEntityXml.addElement("composite-id");
@@ -221,7 +244,9 @@
middleEntityXmlId.addAttribute("name",
mainGenerator.getVerEntCfg().getOriginalIdPropName());
// Adding related-entity (in this case: the referencing's entity id) id
mapping to the xml.
- addRelatedToXmlMapping(middleEntityXmlId, referencingPrefixRelated,
value.getKey(), referencingIdMapping);
+ addRelatedToXmlMapping(middleEntityXmlId, referencingPrefixRelated,
+
MetadataTools.getColumnNameIterator(value.getKey().getColumnIterator()),
+ referencingIdMapping);
// Adding the revision number as a foreign key to the revision info entity to
the composite id of the
// middle table.
@@ -235,7 +260,7 @@
// Generating the element mapping.
// ******
MiddleComponentData elementComponentData =
addValueToMiddleTable(value.getElement(), middleEntityXmlId,
- queryGeneratorBuilder, referencedPrefix);
+ queryGeneratorBuilder, referencedPrefix,
joinTable.inverseJoinColumns());
// ******
// Optionally, generating the index mapping.
@@ -244,8 +269,8 @@
if (value instanceof IndexedCollection) {
IndexedCollection indexedValue = (IndexedCollection) value;
indexComponentData = addValueToMiddleTable(indexedValue.getIndex(),
middleEntityXmlId,
- queryGeneratorBuilder, "mapkey");
- // TODO
+ queryGeneratorBuilder, "mapkey", null);
+ // TODO: @MapKey support, @MapKeyManyToMany
} else {
// No index - creating a dummy mapper.
indexComponentData = new MiddleComponentData(new
MiddleDummyComponentMapper(),
@@ -289,7 +314,7 @@
// ******
// Storing information about this relation.
// ******
-
+
// Only if this is a relation (when there is a referenced entity).
if (referencedEntityName != null) {
if (value.isInverse()) {
@@ -310,11 +335,13 @@
* @param queryGeneratorBuilder In case <code>value</code> is a relation
to another entity, information about it
* should be added to the given.
* @param prefix Prefix for proeprty names of related entities identifiers.
+ * @param joinColumns Names of columns to use in the xml mapping, if this array
isn't null and has any elements.
* @return Data for mapping this component.
*/
+ @SuppressWarnings({"unchecked"})
private MiddleComponentData addValueToMiddleTable(Value value, Element
middleEntityXml,
QueryGeneratorBuilder
queryGeneratorBuilder,
- String prefix) {
+ String prefix, JoinColumn[]
joinColumns) {
Type type = value.getType();
if (type instanceof ManyToOneType) {
String prefixRelated = prefix + "_";
@@ -326,7 +353,11 @@
// Adding related-entity (in this case: the referenced entities id) id
mapping to the xml only if the
// relation isn't inverse (so when
<code>middleEntityXml</code> is not null).
if (middleEntityXml != null) {
- addRelatedToXmlMapping(middleEntityXml, prefixRelated, value,
referencedIdMapping);
+ addRelatedToXmlMapping(middleEntityXml, prefixRelated,
+ joinColumns != null && joinColumns.length > 0
+ ? MetadataTools.getColumnNameIterator(joinColumns)
+ :
MetadataTools.getColumnNameIterator(value.getColumnIterator()),
+ referencedIdMapping);
}
// Storing the id data of the referenced entity: original mapper, prefixed
mapper and entity name.
Modified: trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java
===================================================================
--- trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-09-22
09:48:53 UTC (rev 158)
+++ trunk/src/main/org/jboss/envers/configuration/metadata/MetadataTools.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -27,6 +27,7 @@
import org.jboss.envers.tools.StringTools;
import org.hibernate.mapping.Column;
+import javax.persistence.JoinColumn;
import java.util.Iterator;
/**
@@ -104,8 +105,8 @@
}
public static Element createSubclassEntity(Document document, String entityName,
String tableName,
- String schema, String catalog, String
extendsEntityName,
- String discriminatorValue) {
+ String schema, String catalog, String
extendsEntityName,
+ String discriminatorValue) {
Element class_mapping = createEntityCommon(document, "subclass",
entityName, tableName, schema, catalog,
discriminatorValue);
@@ -137,9 +138,9 @@
addColumn(any_mapping, column.getName(), column.getLength());
}
}
-
+
@SuppressWarnings({"unchecked"})
- private static void changeNamesInColumnElement(Element element,
Iterator<Column> columnIterator) {
+ private static void changeNamesInColumnElement(Element element, ColumnNameIterator
columnNameIterator) {
Iterator<Element> properties = element.elementIterator();
while (properties.hasNext()) {
Element property = properties.next();
@@ -147,15 +148,15 @@
if ("column".equals(property.getName())) {
Attribute nameAttr = property.attribute("name");
if (nameAttr != null) {
- nameAttr.setText(columnIterator.next().getName());
+ nameAttr.setText(columnNameIterator.next());
}
}
}
}
@SuppressWarnings({"unchecked"})
- public static void prefixNamesInPropertyElement(Element element, String prefix,
Iterator<Column> columnIterator,
- boolean changeToKey) {
+ public static void prefixNamesInPropertyElement(Element element, String prefix,
ColumnNameIterator columnNameIterator,
+ boolean changeToKey) {
Iterator<Element> properties = element.elementIterator();
while (properties.hasNext()) {
Element property = properties.next();
@@ -166,7 +167,7 @@
nameAttr.setText(prefix + nameAttr.getText());
}
- changeNamesInColumnElement(property, columnIterator);
+ changeNamesInColumnElement(property, columnNameIterator);
if (changeToKey) {
property.setName("key-property");
@@ -174,4 +175,26 @@
}
}
}
+
+ /**
+ * An iterator over column names.
+ */
+ public static abstract class ColumnNameIterator implements Iterator<String> {
}
+
+ public static ColumnNameIterator getColumnNameIterator(final Iterator<Column>
columnIterator) {
+ return new ColumnNameIterator() {
+ public boolean hasNext() { return columnIterator.hasNext(); }
+ public String next() { return columnIterator.next().getName(); }
+ public void remove() { columnIterator.remove(); }
+ };
+ }
+
+ public static ColumnNameIterator getColumnNameIterator(final JoinColumn[]
joinColumns) {
+ return new ColumnNameIterator() {
+ int counter = 0;
+ public boolean hasNext() { return counter < joinColumns.length; }
+ public String next() { return joinColumns[counter++].name(); }
+ public void remove() { throw new UnsupportedOperationException(); }
+ };
+ }
}
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/PersistentClassVersioningData.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -23,6 +23,7 @@
import org.jboss.envers.ModificationStore;
import org.jboss.envers.VersionsJoinTable;
+import org.jboss.envers.VersionsTable;
import java.util.HashMap;
import java.util.Map;
@@ -42,9 +43,7 @@
}
public PropertyStoreInfo propertyStoreInfo;
- public String versionsTableName;
- public String schema;
- public String catalog;
+ public VersionsTable versionsTable;
public Map<String, String> secondaryTableDictionary;
public List<String> unversionedProperties;
/**
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/ToOneRelationMetadataGenerator.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -46,7 +46,8 @@
Element properties = (Element) idMapping.getXmlRelationMapping().clone();
properties.addAttribute("name", name);
- MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix,
value.getColumnIterator(), false);
+ MetadataTools.prefixNamesInPropertyElement(properties, lastPropertyPrefix,
+ MetadataTools.getColumnNameIterator(value.getColumnIterator()), false);
parent.add(properties);
// Adding mapper for the id
Modified:
trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java
===================================================================
---
trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/main/org/jboss/envers/configuration/metadata/VersionsMetadataGenerator.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -35,6 +35,7 @@
import org.jboss.envers.tools.StringTools;
import org.jboss.envers.tools.HibernateVersion;
import org.jboss.envers.ModificationStore;
+import org.jboss.envers.VersionsJoinTable;
import org.jboss.envers.tools.log.YLog;
import org.jboss.envers.tools.log.YLogManager;
@@ -120,7 +121,7 @@
@SuppressWarnings({"unchecked"})
void addValue(Element parent, String name, Value value, CompositeMapperBuilder
currentMapper,
ModificationStore store, String entityName, EntityXmlMappingData
xmlMappingData,
- boolean firstPass) {
+ VersionsJoinTable joinTable, boolean firstPass) {
Type type = value.getType();
if (type instanceof ComponentType) {
@@ -166,7 +167,7 @@
// only second pass
if (!firstPass) {
collectionMetadataGenerator.addCollection(name, (Collection) value,
currentMapper, entityName,
- xmlMappingData);
+ xmlMappingData, joinTable);
}
} else {
String message = "Type not supported for versioning: " +
type.getClass().getName() +
@@ -181,16 +182,17 @@
@SuppressWarnings({"unchecked"})
private void addProperties(Element parent, Iterator<Property> properties,
CompositeMapperBuilder currentMapper,
- PropertyStoreInfo propertyStoreInfo, String entityName,
EntityXmlMappingData xmlMappingData,
- List<String> unversionedProperties, boolean
firstPass) {
+ PersistentClassVersioningData versioningData, String
entityName, EntityXmlMappingData xmlMappingData,
+ boolean firstPass) {
while (properties.hasNext()) {
Property property = properties.next();
if (!"_identifierMapper".equals(property.getName())) {
- ModificationStore store = getStoreForProperty(property,
propertyStoreInfo, unversionedProperties);
+ ModificationStore store = getStoreForProperty(property,
versioningData.propertyStoreInfo,
+ versioningData.unversionedProperties);
if (store != null) {
addValue(parent, property.getName(), property.getValue(),
currentMapper, store, entityName,
- xmlMappingData, firstPass);
+ xmlMappingData,
versioningData.versionsJoinTables.get(property.getName()), firstPass);
}
}
}
@@ -214,12 +216,12 @@
versionedTableName = verEntCfg.getVersionsEntityName(originalTableName);
}
- String schema = versioningData.schema;
+ String schema = versioningData.versionsTable.schema();
if (StringTools.isEmpty(schema)) {
schema = join.getTable().getSchema();
}
- String catalog = versioningData.catalog;
+ String catalog = versioningData.versionsTable.catalog();
if (StringTools.isEmpty(catalog)) {
catalog = join.getTable().getCatalog();
}
@@ -234,17 +236,16 @@
}
@SuppressWarnings({"unchecked"})
- private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper,
PropertyStoreInfo propertyStoreInfo,
- String entityName, EntityXmlMappingData xmlMappingData,
List<String> unversionedProperties,
- boolean firstPass) {
+ private void addJoins(PersistentClass pc, CompositeMapperBuilder currentMapper,
PersistentClassVersioningData versioningData,
+ String entityName, EntityXmlMappingData xmlMappingData,boolean
firstPass) {
Iterator<Join> joins = pc.getJoinIterator();
while (joins.hasNext()) {
Join join = joins.next();
Element joinElement = entitiesJoins.get(entityName).get(join);
- addProperties(joinElement, join.getPropertyIterator(), currentMapper,
propertyStoreInfo, entityName,
- xmlMappingData, unversionedProperties, firstPass);
+ addProperties(joinElement, join.getPropertyIterator(), currentMapper,
versioningData, entityName,
+ xmlMappingData, firstPass);
}
}
@@ -264,12 +265,12 @@
@SuppressWarnings({"unchecked"})
public void generateFirstPass(PersistentClass pc, PersistentClassVersioningData
versioningData,
EntityXmlMappingData xmlMappingData) {
- String schema = versioningData.schema;
+ String schema = versioningData.versionsTable.schema();
if (StringTools.isEmpty(schema)) {
schema = pc.getTable().getSchema();
}
- String catalog = versioningData.catalog;
+ String catalog = versioningData.versionsTable.catalog();
if (StringTools.isEmpty(catalog)) {
catalog = pc.getTable().getCatalog();
}
@@ -335,13 +336,12 @@
// Mapping unjoined properties
addProperties(class_mapping, (Iterator<Property>)
pc.getUnjoinedPropertyIterator(), propertyMapper,
- versioningData.propertyStoreInfo, pc.getEntityName(), xmlMappingData,
versioningData.unversionedProperties,
+ versioningData, pc.getEntityName(), xmlMappingData,
true);
// Creating and mapping joins (first pass)
createJoins(pc, class_mapping, versioningData);
- addJoins(pc, propertyMapper, versioningData.propertyStoreInfo,
pc.getEntityName(), xmlMappingData,
- versioningData.unversionedProperties, true);
+ addJoins(pc, propertyMapper, versioningData, pc.getEntityName(), xmlMappingData,
true);
// Storing the generated configuration
EntityConfiguration entityCfg = new EntityConfiguration(entityName,
versionsEntityName, idMapper,
@@ -363,12 +363,10 @@
}
addProperties(parent, (Iterator<Property>)
pc.getUnjoinedPropertyIterator(),
- propertyMapper, versioningData.propertyStoreInfo, entityName,
xmlMappingData,
- versioningData.unversionedProperties, false);
+ propertyMapper, versioningData, entityName, xmlMappingData, false);
// Mapping joins (second pass)
- addJoins(pc, propertyMapper, versioningData.propertyStoreInfo, entityName,
xmlMappingData,
- versioningData.unversionedProperties, false);
+ addJoins(pc, propertyMapper, versioningData, entityName, xmlMappingData, false);
}
public Map<String, EntityConfiguration> getEntitiesConfigurations() {
Copied:
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
(from rev 148,
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetRefCollEntity.java)
===================================================================
---
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -0,0 +1,87 @@
+package org.jboss.envers.test.entities.onetomany.detached;
+
+import org.jboss.envers.Versioned;
+import org.jboss.envers.test.entities.StrTestEntity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+import java.util.Set;
+
+/**
+ * A detached relation to another entity, with a @OneToMany+@JoinColumn mapping.
+ * @author Adam Warski (adam at warski dot org)
+ */
+@Entity
+public class SetJoinColumnRefCollEntity {
+ @Id
+ private Integer id;
+
+ @Versioned
+ private String data;
+
+ @Versioned
+ @OneToMany
+ @JoinColumn(name = "SJCR_ID")
+ private Set<StrTestEntity> collection;
+
+ public SetJoinColumnRefCollEntity() {
+ }
+
+ public SetJoinColumnRefCollEntity(Integer id, String data) {
+ this.id = id;
+ this.data = data;
+ }
+
+ public SetJoinColumnRefCollEntity(String data) {
+ this.data = data;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public Set<StrTestEntity> getCollection() {
+ return collection;
+ }
+
+ public void setCollection(Set<StrTestEntity> collection) {
+ this.collection = collection;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SetJoinColumnRefCollEntity)) return false;
+
+ SetJoinColumnRefCollEntity that = (SetJoinColumnRefCollEntity) o;
+
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (id != null ? id.hashCode() : 0);
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "SetJoinColumnRefCollEntity(id = " + id + ", data = "
+ data + ")";
+ }
+}
\ No newline at end of file
Property changes on:
trunk/src/test/org/jboss/envers/test/entities/onetomany/detached/SetJoinColumnRefCollEntity.java
___________________________________________________________________
Name: svn:mergeinfo
+
Modified:
trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java
===================================================================
---
trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-09-22
09:48:53 UTC (rev 158)
+++
trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -75,11 +75,10 @@
assert "data1".equals(rev2.getData());
}
- private final static String MIDDLE_VERSIONS_ENTITY_NAME =
- "UNI_NAMING_TEST_versions";
+ private final static String MIDDLE_VERSIONS_ENTITY_NAME =
"UNI_NAMING_TEST_versions";
@Test
public void testTableName() {
- assert "UNI_NAMING_TEST_versions".equals(
+ assert MIDDLE_VERSIONS_ENTITY_NAME.equals(
getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getName());
}
Copied:
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java (from
rev 152,
trunk/src/test/org/jboss/envers/test/integration/naming/OneToManyUnidirectionalNaming.java)
===================================================================
--- trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -0,0 +1,108 @@
+package org.jboss.envers.test.integration.naming;
+
+import org.jboss.envers.test.integration.AbstractEntityTest;
+import org.jboss.envers.test.entities.StrTestEntity;
+import org.jboss.envers.test.tools.TestTools;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.mapping.Column;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import javax.persistence.EntityManager;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class VersionsJoinTableNaming extends AbstractEntityTest {
+ private Integer uni1_id;
+ private Integer str1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(VersionsJoinTableTestEntity.class);
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ VersionsJoinTableTestEntity uni1 = new VersionsJoinTableTestEntity(1,
"data1");
+ StrTestEntity str1 = new StrTestEntity("str1");
+
+ // Revision 1
+ EntityManager em = getEntityManager();
+ em.getTransaction().begin();
+
+ uni1.setCollection(new HashSet<StrTestEntity>());
+ em.persist(uni1);
+ em.persist(str1);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em.getTransaction().begin();
+
+ uni1 = em.find(VersionsJoinTableTestEntity.class, uni1.getId());
+ str1 = em.find(StrTestEntity.class, str1.getId());
+ uni1.getCollection().add(str1);
+
+ em.getTransaction().commit();
+
+ //
+
+ uni1_id = uni1.getId();
+ str1_id = str1.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1,
2).equals(getVersionsReader().getRevisions(VersionsJoinTableTestEntity.class, uni1_id));
+ assert
Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id));
+ }
+
+ @Test
+ public void testHistoryOfUniId1() {
+ StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id);
+
+ VersionsJoinTableTestEntity rev1 =
getVersionsReader().find(VersionsJoinTableTestEntity.class, uni1_id, 1);
+ VersionsJoinTableTestEntity rev2 =
getVersionsReader().find(VersionsJoinTableTestEntity.class, uni1_id, 2);
+
+ assert rev1.getCollection().equals(TestTools.makeSet());
+ assert rev2.getCollection().equals(TestTools.makeSet(str1));
+
+ assert "data1".equals(rev1.getData());
+ assert "data1".equals(rev2.getData());
+ }
+
+ private final static String MIDDLE_VERSIONS_ENTITY_NAME =
"VERSIONS_JOIN_TABLE_TEST";
+
+ @Test
+ public void testTableName() {
+ assert MIDDLE_VERSIONS_ENTITY_NAME.equals(
+
getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getName());
+ }
+
+ @SuppressWarnings({"unchecked"})
+ @Test
+ public void testJoinColumnName() {
+ Iterator<Column> columns =
+
getCfg().getClassMapping(MIDDLE_VERSIONS_ENTITY_NAME).getTable().getColumnIterator();
+
+ boolean id1Found = false;
+ boolean id2Found = false;
+
+ while (columns.hasNext()) {
+ Column column = columns.next();
+ if ("VJT_ID".equals(column.getName())) {
+ id1Found = true;
+ }
+
+ if ("STR_ID".equals(column.getName())) {
+ id2Found = true;
+ }
+ }
+
+ assert id1Found && id2Found;
+ }
+}
\ No newline at end of file
Property changes on:
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableNaming.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied:
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
(from rev 148,
trunk/src/test/org/jboss/envers/test/integration/naming/DetachedNamingTestEntity.java)
===================================================================
---
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -0,0 +1,85 @@
+package org.jboss.envers.test.integration.naming;
+
+import org.jboss.envers.Versioned;
+import org.jboss.envers.VersionsJoinTable;
+import org.jboss.envers.test.entities.StrTestEntity;
+
+import javax.persistence.*;
+import java.util.Set;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+@Entity
+public class VersionsJoinTableTestEntity {
+ @Id
+ private Integer id;
+
+ @Versioned
+ private String data;
+
+ @Versioned
+ @OneToMany
+ @JoinColumn(name = "VJT_ID")
+ @VersionsJoinTable(name = "VERSIONS_JOIN_TABLE_TEST", inverseJoinColumns =
@JoinColumn(name = "STR_ID"))
+ private Set<StrTestEntity> collection;
+
+ public VersionsJoinTableTestEntity() {
+ }
+
+ public VersionsJoinTableTestEntity(Integer id, String data) {
+ this.id = id;
+ this.data = data;
+ }
+
+ public VersionsJoinTableTestEntity(String data) {
+ this.data = data;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+
+ public Set<StrTestEntity> getCollection() {
+ return collection;
+ }
+
+ public void setCollection(Set<StrTestEntity> collection) {
+ this.collection = collection;
+ }
+
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof VersionsJoinTableTestEntity)) return false;
+
+ VersionsJoinTableTestEntity that = (VersionsJoinTableTestEntity) o;
+
+ if (data != null ? !data.equals(that.data) : that.data != null) return false;
+ if (id != null ? !id.equals(that.id) : that.id != null) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = (id != null ? id.hashCode() : 0);
+ result = 31 * result + (data != null ? data.hashCode() : 0);
+ return result;
+ }
+
+ public String toString() {
+ return "VersionsJoinTableTestEntity(id = " + id + ", data = "
+ data + ")";
+ }
+}
\ No newline at end of file
Property changes on:
trunk/src/test/org/jboss/envers/test/integration/naming/VersionsJoinTableTestEntity.java
___________________________________________________________________
Name: svn:mergeinfo
+
Copied:
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java
(from rev 156,
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicDetachedSet.java)
===================================================================
---
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java
(rev 0)
+++
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java 2008-09-22
11:26:24 UTC (rev 159)
@@ -0,0 +1,115 @@
+package org.jboss.envers.test.integration.onetomany.detached;
+
+import org.jboss.envers.test.integration.AbstractEntityTest;
+import org.jboss.envers.test.entities.StrTestEntity;
+import org.jboss.envers.test.entities.onetomany.detached.SetJoinColumnRefCollEntity;
+import org.jboss.envers.test.tools.TestTools;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import javax.persistence.EntityManager;
+import java.util.Arrays;
+import java.util.HashSet;
+
+/**
+ * @author Adam Warski (adam at warski dot org)
+ */
+public class BasicJoinColumnSet extends AbstractEntityTest {
+ private Integer str1_id;
+ private Integer str2_id;
+
+ private Integer coll1_id;
+
+ public void configure(Ejb3Configuration cfg) {
+ cfg.addAnnotatedClass(StrTestEntity.class);
+ cfg.addAnnotatedClass(SetJoinColumnRefCollEntity.class);
+ }
+
+ @BeforeClass(dependsOnMethods = "init")
+ public void initData() {
+ EntityManager em = getEntityManager();
+
+ StrTestEntity str1 = new StrTestEntity("str1");
+ StrTestEntity str2 = new StrTestEntity("str2");
+
+ SetJoinColumnRefCollEntity coll1 = new SetJoinColumnRefCollEntity(3,
"coll1");
+
+ // Revision 1
+ em.getTransaction().begin();
+
+ em.persist(str1);
+ em.persist(str2);
+
+ coll1.setCollection(new HashSet<StrTestEntity>());
+ coll1.getCollection().add(str1);
+ em.persist(coll1);
+
+ em.getTransaction().commit();
+
+ // Revision 2
+ em.getTransaction().begin();
+
+ str2 = em.find(StrTestEntity.class, str2.getId());
+ coll1 = em.find(SetJoinColumnRefCollEntity.class, coll1.getId());
+
+ coll1.getCollection().add(str2);
+
+ em.getTransaction().commit();
+
+ // Revision 3
+ em.getTransaction().begin();
+
+ str1 = em.find(StrTestEntity.class, str1.getId());
+ coll1 = em.find(SetJoinColumnRefCollEntity.class, coll1.getId());
+
+ coll1.getCollection().remove(str1);
+
+ em.getTransaction().commit();
+
+ // Revision 4
+ em.getTransaction().begin();
+
+ coll1 = em.find(SetJoinColumnRefCollEntity.class, coll1.getId());
+
+ coll1.getCollection().clear();
+
+ em.getTransaction().commit();
+
+ //
+
+ str1_id = str1.getId();
+ str2_id = str2.getId();
+
+ coll1_id = coll1.getId();
+ }
+
+ @Test
+ public void testRevisionsCounts() {
+ assert Arrays.asList(1, 2, 3,
4).equals(getVersionsReader().getRevisions(SetJoinColumnRefCollEntity.class, coll1_id));
+
+ assert
Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str1_id));
+ assert
Arrays.asList(1).equals(getVersionsReader().getRevisions(StrTestEntity.class, str2_id));
+ }
+
+ @Test
+ public void testHistoryOfColl1() {
+ StrTestEntity str1 = getEntityManager().find(StrTestEntity.class, str1_id);
+ StrTestEntity str2 = getEntityManager().find(StrTestEntity.class, str2_id);
+
+ SetJoinColumnRefCollEntity rev1 =
getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 1);
+ SetJoinColumnRefCollEntity rev2 =
getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 2);
+ SetJoinColumnRefCollEntity rev3 =
getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 3);
+ SetJoinColumnRefCollEntity rev4 =
getVersionsReader().find(SetJoinColumnRefCollEntity.class, coll1_id, 4);
+
+ assert rev1.getCollection().equals(TestTools.makeSet(str1));
+ assert rev2.getCollection().equals(TestTools.makeSet(str1, str2));
+ assert rev3.getCollection().equals(TestTools.makeSet(str2));
+ assert rev4.getCollection().equals(TestTools.makeSet());
+
+ assert "coll1".equals(rev1.getData());
+ assert "coll1".equals(rev2.getData());
+ assert "coll1".equals(rev3.getData());
+ assert "coll1".equals(rev4.getData());
+ }
+}
\ No newline at end of file
Property changes on:
trunk/src/test/org/jboss/envers/test/integration/onetomany/detached/BasicJoinColumnSet.java
___________________________________________________________________
Name: svn:mergeinfo
+