[hibernate-commits] Hibernate SVN: r16011 - in branches/Branch_3_2/HibernateExt/tools: src/java/org/hibernate and 6 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Fri Feb 20 11:11:57 EST 2009
Author: max.andersen at jboss.com
Date: 2009-02-20 11:11:57 -0500 (Fri, 20 Feb 2009)
New Revision: 16011
Added:
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java
Modified:
branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java
branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd
branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java
branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml
branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java
Log:
HBX-623 provide cascade control in reveng.xml
+ fix bugs in one-to-one/inverse-one-to-one handling with respect to naming.
Modified: branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/etc/log4j.properties 2009-02-20 16:11:57 UTC (rev 16011)
@@ -18,6 +18,7 @@
log4j.logger.org.hibernate.cfg.SettingsFactory=warn
log4j.logger.org.hibernate.cfg.reveng=debug
log4j.logger.org.hibernate.cfg.JDBCMetaDataConfiguration=debug
+log4j.logger.org.hibernate.cfg.JDBCBinder=debug
#log4j.logger.freemarker=debug
### log just the SQL
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -22,6 +22,8 @@
import org.hibernate.FetchMode;
import org.hibernate.MappingException;
import org.hibernate.cfg.reveng.DatabaseCollector;
+import org.hibernate.cfg.reveng.ForeignKeyCollectionInfo;
+import org.hibernate.cfg.reveng.AssociationInfo;
import org.hibernate.cfg.reveng.JDBCReader;
import org.hibernate.cfg.reveng.JDBCToHibernateTypeHelper;
import org.hibernate.cfg.reveng.MappingsDatabaseCollector;
@@ -45,6 +47,7 @@
import org.hibernate.mapping.RootClass;
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Table;
+import org.hibernate.mapping.ToOne;
import org.hibernate.mapping.Value;
import org.hibernate.type.ForeignKeyDirection;
import org.hibernate.type.Type;
@@ -239,9 +242,9 @@
foreignKey.getColumns(),
TableIdentifier.create(foreignKey.getReferencedTable() ),
foreignKey.getReferencedColumns())) {
- log.debug("Rev.eng excluded one-to-many for foreignkey " + foreignKey.getName());
+ log.debug("Rev.eng excluded one-to-many or one-to-one for foreignkey " + foreignKey.getName());
} else if (revengStrategy.isOneToOne(foreignKey)){
- Property property = bindOneToOne(rc, foreignKey.getTable(), foreignKey, processed, false);
+ Property property = bindOneToOne(rc, foreignKey.getTable(), foreignKey, processed, false, true);
rc.addProperty(property);
} else {
Property property = bindOneToMany(rc, foreignKey, processed, mapping);
@@ -253,7 +256,7 @@
private Property bindOneToOne(PersistentClass rc, Table targetTable,
- ForeignKey fk, Set processedColumns, boolean constrained) {
+ ForeignKey fk, Set processedColumns, boolean constrained, boolean inverseProperty) {
OneToOne value = new OneToOne(targetTable, rc);
@@ -261,11 +264,18 @@
.tableToClassName(TableIdentifier.create(targetTable)));
boolean isUnique = isUniqueReference(fk);
- String propertyName =
- revengStrategy.foreignKeyToEntityName(fk.getName(),
+ String propertyName = null;
+ if(inverseProperty) {
+ propertyName = revengStrategy.foreignKeyToInverseEntityName(fk.getName(),
+ TableIdentifier.create(fk.getReferencedTable()), fk
+ .getReferencedColumns(), TableIdentifier
+ .create(targetTable), fk.getColumns(), isUnique);
+ } else {
+ propertyName = revengStrategy.foreignKeyToEntityName(fk.getName(),
TableIdentifier.create(fk.getReferencedTable()), fk
.getReferencedColumns(), TableIdentifier
.create(targetTable), fk.getColumns(), isUnique);
+ }
Iterator columns = fk.getColumnIterator();
while (columns.hasNext()) {
@@ -282,11 +292,14 @@
ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT :
ForeignKeyDirection.FOREIGN_KEY_TO_PARENT );
- return makeProperty(TableIdentifier.create(targetTable), propertyName, value,
- true, true, value.getFetchMode() != FetchMode.JOIN, null, null);
+
+ return makeEntityProperty(propertyName, true, targetTable, fk, value, inverseProperty);
+ //return makeProperty(TableIdentifier.create(targetTable), propertyName, value,
+ // true, true, value.getFetchMode() != FetchMode.JOIN, null, null);
}
/**
+ * @param mutable
* @param table
* @param fk
* @param columnsToBind
@@ -294,7 +307,7 @@
* @param rc
* @param propName
*/
- private Property bindManyToOne(String propertyName, Table table, ForeignKey fk, Set processedColumns) {
+ private Property bindManyToOne(String propertyName, boolean mutable, Table table, ForeignKey fk, Set processedColumns) {
ManyToOne value = new ManyToOne(table);
value.setReferencedEntityName( fk.getReferencedEntityName() );
Iterator columns = fk.getColumnIterator();
@@ -304,10 +317,84 @@
value.addColumn(fkcolumn);
processedColumns.add(fkcolumn);
}
- value.setFetchMode(FetchMode.SELECT);
- return makeProperty(TableIdentifier.create( table ), propertyName, value, true, true, value.getFetchMode()!=FetchMode.JOIN, null, null);
+ value.setFetchMode(FetchMode.SELECT);
+
+ return makeEntityProperty(propertyName, mutable, table, fk, value, false);
}
+ private Property makeCollectionProperty(String propertyName, boolean mutable,
+ Table table, ForeignKey fk, Collection value, boolean inverseProperty) {
+ AssociationInfo fkei = inverseProperty?revengStrategy.foreignKeyToInverseAssociationInfo(fk):revengStrategy.foreignKeyToAssociationInfo(fk);
+
+ String fetchMode = null;
+ String cascade = null;
+ boolean update = mutable;
+ boolean insert = mutable;
+
+ if(fkei != null){
+ cascade = fkei.getCascade();
+ if(fkei.getUpdate()!=null) {
+ update = fkei.getUpdate().booleanValue();
+ }
+ if(fkei.getInsert()!=null) {
+ insert = fkei.getInsert().booleanValue();
+ }
+
+ fetchMode = fkei.getFetch();
+
+
+ }
+
+ if(FetchMode.JOIN.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.JOIN);
+ }
+ else if(FetchMode.SELECT.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+ else {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+
+ return makeProperty(TableIdentifier.create( table ), propertyName, value, insert, update, value.getFetchMode()!=FetchMode.JOIN, cascade, null);
+
+ }
+
+ private Property makeEntityProperty(String propertyName, boolean mutable,
+ Table table, ForeignKey fk, ToOne value, boolean inverseProperty) {
+ AssociationInfo fkei = inverseProperty?revengStrategy.foreignKeyToInverseAssociationInfo(fk):revengStrategy.foreignKeyToAssociationInfo(fk);
+
+ String fetchMode = null;
+ String cascade = null;
+ boolean update = mutable;
+ boolean insert = mutable;
+
+ if(fkei != null){
+ cascade = fkei.getCascade();
+ if(fkei.getUpdate()!=null) {
+ update = fkei.getUpdate().booleanValue();
+ }
+ if(fkei.getInsert()!=null) {
+ insert = fkei.getInsert().booleanValue();
+ }
+
+ fetchMode = fkei.getFetch();
+
+
+ }
+
+ if(FetchMode.JOIN.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.JOIN);
+ }
+ else if(FetchMode.SELECT.toString().equalsIgnoreCase(fetchMode)) {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+ else {
+ value.setFetchMode(FetchMode.SELECT);
+ }
+
+ return makeProperty(TableIdentifier.create( table ), propertyName, value, insert, update, value.getFetchMode()!=FetchMode.JOIN, cascade, null);
+ }
+
/**
* @param rc
* @param processed
@@ -326,7 +413,7 @@
boolean manyToMany = revengStrategy.isManyToManyTable( collectionTable );
if(manyToMany) {
- log.debug("Rev.eng said here is a many-to-many");
+ //log.debug("Rev.eng said here is a many-to-many");
// TODO: handle "the other side should influence the name"
}
@@ -395,10 +482,13 @@
mappings.addCollection(collection);
- return makeProperty(TableIdentifier.create( rc.getTable() ), StringHelper.unqualify( collection.getRole() ), collection, true, true, true, "all", null); // TODO: cascade isn't all by default
+ return makeCollectionProperty(StringHelper.unqualify( collection.getRole() ), true, rc.getTable(), foreignKey, collection, true);
+ //return makeProperty(TableIdentifier.create( rc.getTable() ), StringHelper.unqualify( collection.getRole() ), collection, true, true, true, "none", null); // TODO: cascade isn't all by default
+
}
+
private String bindCollection(PersistentClass rc, ForeignKey fromForeignKey, ForeignKey toForeignKey, Collection collection) {
ForeignKey targetKey = fromForeignKey;
String collectionRole = null;
@@ -458,8 +548,8 @@
collection.setInverse(collectionInverse); // TODO: allow overriding this
collection.setLazy(collectionLazy);
collection.setFetchMode(FetchMode.SELECT);
+
-
return tableToClassName;
}
@@ -583,9 +673,9 @@
TableIdentifier.create(foreignKey.getReferencedTable() ),
foreignKey.getReferencedColumns())) {
// TODO: if many-to-one is excluded should the column be marked as processed so it won't show up at all ?
- log.debug("Rev.eng excluded many-to-one for foreignkey " + foreignKey.getName());
+ log.debug("Rev.eng excluded *-to-one for foreignkey " + foreignKey.getName());
} else if (revengStrategy.isOneToOne(foreignKey)){
- Property property = bindOneToOne(rc, foreignKey.getReferencedTable(), foreignKey, processedColumns, true);
+ Property property = bindOneToOne(rc, foreignKey.getReferencedTable(), foreignKey, processedColumns, true, false);
rc.addProperty(property);
} else {
boolean isUnique = isUniqueReference(foreignKey);
@@ -599,13 +689,12 @@
);
Property property = bindManyToOne(
- makeUnique(rc, propertyName),
+ makeUnique(rc, propertyName),
+ mutable,
table,
foreignKey,
processedColumns
);
- property.setUpdateable(mutable);
- property.setInsertable(mutable);
rc.addProperty(property);
}
@@ -816,7 +905,7 @@
TableIdentifier.create(foreignKey.getTable() ),
foreignKey.getColumns(), TableIdentifier.create(foreignKey.getReferencedTable() ), foreignKey.getReferencedColumns(), true
);
- property = bindManyToOne( makeUnique(pkc, propertyName), table, foreignKey, processedColumns);
+ property = bindManyToOne( makeUnique(pkc, propertyName), true, table, foreignKey, processedColumns);
processedColumns.addAll(fkfc.columns);
}
else {
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AssociationInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,12 @@
+package org.hibernate.cfg.reveng;
+
+public interface AssociationInfo {
+
+ String getCascade();
+
+ String getFetch();
+
+ Boolean getUpdate();
+ Boolean getInsert();
+
+}
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaulAssociationInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,35 @@
+package org.hibernate.cfg.reveng;
+
+public class DefaulAssociationInfo implements AssociationInfo {
+
+ String cascade;
+ String fetch;
+ Boolean insert;
+ Boolean update;
+
+ public String getCascade() {
+ return cascade;
+ }
+ public void setCascade(String cascade) {
+ this.cascade = cascade;
+ }
+ public String getFetch() {
+ return fetch;
+ }
+ public void setFetch(String fetch) {
+ this.fetch = fetch;
+ }
+ public Boolean getInsert() {
+ return insert;
+ }
+ public void setInsert(Boolean insert) {
+ this.insert = insert;
+ }
+ public Boolean getUpdate() {
+ return update;
+ }
+ public void setUpdate(Boolean update) {
+ this.update = update;
+ }
+
+}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -79,6 +79,14 @@
return ReverseEngineeringStrategyUtil.simplePluralize(singular);
}
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ return foreignKeyToEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
+ }
+
+
public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference) {
String propertyName = Introspector.decapitalize( StringHelper.unqualify( getRoot().tableToClassName(referencedTable) ) );
@@ -339,5 +347,15 @@
public Map columnToMetaAttributes(TableIdentifier identifier, String column) {
return null;
}
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ return null;
+ }
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ return null;
+ }
+
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -137,6 +137,21 @@
public Map columnToMetaAttributes(TableIdentifier identifier, String column) {
return delegate==null?null:delegate.columnToMetaAttributes( identifier, column );
+ }
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ return delegate==null?null:delegate.foreignKeyToAssociationInfo(foreignKey);
+ }
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ return delegate==null?null:delegate.foreignKeyToInverseAssociationInfo(foreignKey);
+ }
+
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ return delegate==null?null:delegate.foreignKeyToInverseEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
}
}
Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ForeignKeyCollectionInfo.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -0,0 +1,16 @@
+package org.hibernate.cfg.reveng;
+
+public interface ForeignKeyCollectionInfo {
+
+ String getCascade();
+
+ String getFetch();
+
+ Boolean getUpdate();
+ Boolean getInsert();
+
+ String getLazy();
+
+}
+
+
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -47,6 +47,37 @@
}
+ static boolean bindManyToOneAndCollection(Element element, String constraintName, OverrideRepository repository) {
+
+ String manyToOneProperty = null;
+ Boolean excludeManyToOne = null;
+
+ DefaulAssociationInfo associationInfo = null;
+ DefaulAssociationInfo inverseAssociationInfo = null;
+ Element manyToOne = element.element("many-to-one");
+ if(manyToOne!=null) {
+ manyToOneProperty = manyToOne.attributeValue("property");
+ excludeManyToOne = BooleanValue(manyToOne.attributeValue("exclude"));
+ associationInfo = extractAssociationInfo(manyToOne);
+ }
+
+ String collectionProperty = null;
+ Boolean excludeCollection = null;
+ Element collection = element.element("set");
+ if(collection!=null) {
+ collectionProperty = collection.attributeValue("property");
+ excludeCollection = BooleanValue(collection.attributeValue("exclude"));
+ inverseAssociationInfo = extractAssociationInfo(collection);
+ }
+
+ if ( (manyToOne!=null) || (collection!=null) ) {
+ repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection, associationInfo, inverseAssociationInfo);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
private static void bindSchemaSelection(List selection, OverrideRepository repository) {
Iterator iterator = selection.iterator();
@@ -162,66 +193,100 @@
if(StringHelper.isNotEmpty(constraintName)) {
if (!validateFkAssociations(element))
throw new IllegalArgumentException("you can't mix <many-to-one/> or <set/> with <(inverse-)one-to-one/> ");
- String manyToOneProperty = null;
- Boolean excludeManyToOne = null;
- Element manyToOne = element.element("many-to-one");
- if(manyToOne!=null) {
- manyToOneProperty = manyToOne.attributeValue("property");
- excludeManyToOne = BooleanValue(manyToOne.attributeValue("exclude"));
- }
-
- String collectionProperty = null;
- Boolean excludeCollection = null;
- Element collection = element.element("set");
- if(collection!=null) {
- collectionProperty = collection.attributeValue("property");
- excludeCollection = BooleanValue(collection.attributeValue("exclude"));
- }
-
- if ( (manyToOne!=null) || (collection!=null) ) {
- repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection);
- continue;
- }
-
- String oneToOneProperty = null;
- Boolean excludeOneToOne = null;
- Element oneToOne = element.element("one-to-one");
- if(oneToOne!=null) {
- oneToOneProperty = oneToOne.attributeValue("property");
- excludeOneToOne = BooleanValue(oneToOne.attributeValue("exclude"));
- }
-
- String inverseOneToOneProperty = null;
- Boolean excludeInverseOneToOne = null;
- Element inverseOneToOne = element.element("inverse-one-to-one");
- if(inverseOneToOne!=null) {
- inverseOneToOneProperty = oneToOne.attributeValue("property");
- excludeInverseOneToOne = BooleanValue(inverseOneToOne.attributeValue("exclude"));
- }
-
- // having oneToOne = null and inverseOneToOne != null doesn't make sense
- // we cannot have the inserse side without the owning side in this case
-
- if ( (oneToOne!=null) ) {
- repository.addForeignKeyInfo(constraintName, oneToOneProperty, excludeOneToOne, inverseOneToOneProperty, excludeInverseOneToOne);
- }
+ if(!bindManyToOneAndCollection(element, constraintName, repository)) {
+ bindOneToOne(element, constraintName, repository);
+ }
}
}
}
+ private static void bindOneToOne(Element element, String constraintName,
+ OverrideRepository repository) {
+ String oneToOneProperty = null;
+ Boolean excludeOneToOne = null;
+ Element oneToOne = element.element("one-to-one");
+ DefaulAssociationInfo associationInfo = null;
+ if(oneToOne!=null) {
+ oneToOneProperty = oneToOne.attributeValue("property");
+ excludeOneToOne = BooleanValue(oneToOne.attributeValue("exclude"));
+ associationInfo = extractAssociationInfo(oneToOne);
+ }
+
+ String inverseOneToOneProperty = null;
+ Boolean excludeInverseOneToOne = null;
+ Element inverseOneToOne = element.element("inverse-one-to-one");
+ DefaulAssociationInfo inverseAssociationInfo = null;
+ if(inverseOneToOne!=null) {
+ inverseOneToOneProperty = inverseOneToOne.attributeValue("property");
+ excludeInverseOneToOne = BooleanValue(inverseOneToOne.attributeValue("exclude"));
+ inverseAssociationInfo = extractAssociationInfo(inverseOneToOne);
+ }
+
+ // having oneToOne = null and inverseOneToOne != null doesn't make sense
+ // we cannot have the inverse side without the owning side in this case
+
+ if ( (oneToOne!=null) ) {
+ repository.addForeignKeyInfo(constraintName, oneToOneProperty, excludeOneToOne, inverseOneToOneProperty, excludeInverseOneToOne, associationInfo, inverseAssociationInfo);
+ }
+ }
+
+ private static DefaulAssociationInfo extractAssociationInfo(Element manyToOne) {
+ String attributeValue = manyToOne.attributeValue("cascade");
+ DefaulAssociationInfo associationInfo = null;
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setCascade(attributeValue);
+ }
+
+
+ attributeValue = manyToOne.attributeValue("fetch");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setFetch(attributeValue);
+ }
+
+
+ attributeValue = manyToOne.attributeValue("insert");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setInsert(new Boolean(attributeValue));
+ }
+
+
+ attributeValue = manyToOne.attributeValue("update");
+ if(attributeValue!=null) {
+ associationInfo = ensureInit(associationInfo);
+ associationInfo.setUpdate(new Boolean(attributeValue));
+ }
+ return associationInfo;
+ }
+
+ private static DefaulAssociationInfo ensureInit(
+ DefaulAssociationInfo associationInfo) {
+ return associationInfo==null?new DefaulAssociationInfo():associationInfo;
+ }
+
private static boolean validateFkAssociations(Element element){
Element manyToOne = element.element("many-to-one");
Element oneToOne = element.element("one-to-one");
Element set = element.element("set");
Element inverseOneToOne = element.element("inverse-one-to-one");
- if (manyToOne != null && ( oneToOne != null || inverseOneToOne != null)
- || oneToOne != null && set != null
- || inverseOneToOne != null && set != null)
+ if((manyToOne != null) && ( (oneToOne != null) || (inverseOneToOne != null))) {
return false;
+
+ }
+
+ if((oneToOne != null) && (set != null)) {
+ return false;
+ }
+ if ((inverseOneToOne != null) && (set != null)) {
+ return false;
+ }
+
return true;
}
@@ -384,6 +449,7 @@
String getMatchString(String input) {
return input.toUpperCase();
}
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -69,6 +69,9 @@
final private Map foreignKeyInverseExclude;
final private Map foreignKeyToOneExclude;
+
+ final private Map foreignKeyToEntityInfo;
+ final private Map foreignKeyToInverseEntityInfo;
final private Map tableMetaAttributes; // TI -> MultiMap of SimpleMetaAttributes
@@ -102,6 +105,8 @@
foreignKeyToOneExclude = new HashMap();
tableMetaAttributes = new HashMap();
columnMetaAttributes = new HashMap();
+ foreignKeyToEntityInfo = new HashMap();
+ foreignKeyToInverseEntityInfo = new HashMap();
}
public OverrideRepository addFile(File xmlFile) {
@@ -426,6 +431,20 @@
}
}
+ @Override
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable,
+ List referencedColumnNames, boolean uniqueReference) {
+
+ String property = (String) foreignKeyToInverseName.get(keyname);
+ if(property==null) {
+ return super.foreignKeyToInverseEntityName(keyname, fromTable, fromColumnNames, referencedTable, referencedColumnNames, uniqueReference);
+ } else {
+ return property;
+ }
+ }
+
public String foreignKeyToCollectionName(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns, boolean uniqueReference) {
String property = (String) foreignKeyToInverseName.get(keyname);
if(property==null) {
@@ -454,6 +473,25 @@
referencedTable, referencedColumns );
}
}
+
+
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ AssociationInfo fkei = (AssociationInfo) foreignKeyToInverseEntityInfo.get(foreignKey.getName());
+ if(fkei!=null) {
+ return fkei;
+ } else {
+ return super.foreignKeyToInverseAssociationInfo(foreignKey);
+ }
+ }
+
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ AssociationInfo fkei = (AssociationInfo) foreignKeyToEntityInfo.get(foreignKey.getName());
+ if(fkei!=null) {
+ return fkei;
+ } else {
+ return super.foreignKeyToAssociationInfo(foreignKey);
+ }
+ }
};
}
@@ -609,7 +647,7 @@
* the owning side can generate a toOne (ManyToOne or OneToOne), we call this side foreignKeyToOne
* the inverse side can generate a OneToMany OR a OneToOne (in case we have a pure bidirectional OneToOne, we call this side foreignKeyToInverse
*/
- public void addForeignKeyInfo(String constraintName, String toOneProperty, Boolean excludeToOne, String inverseProperty, Boolean excludeInverse) {
+ public void addForeignKeyInfo(String constraintName, String toOneProperty, Boolean excludeToOne, String inverseProperty, Boolean excludeInverse, AssociationInfo associationInfo, AssociationInfo inverseAssociationInfo) {
if(StringHelper.isNotEmpty(toOneProperty)) {
foreignKeyToOneName.put(constraintName, toOneProperty);
}
@@ -622,6 +660,13 @@
if(excludeToOne!=null) {
foreignKeyToOneExclude.put(constraintName, excludeToOne);
}
+ if(associationInfo!=null) {
+ foreignKeyToEntityInfo.put(constraintName, associationInfo);
+ }
+ if(inverseAssociationInfo!=null) {
+ foreignKeyToInverseEntityInfo.put(constraintName, inverseAssociationInfo);
+ }
+
}
public void addMetaAttributeInfo(Table table, Map map) {
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -166,6 +166,16 @@
*/
public String foreignKeyToEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference);
+ /**
+ * Used to rename the inverse one-to-one properties.
+ *
+ * @param fromColumns list of Column instances on the fromTable. Only col.getName() should be assumed to be correct
+ * @param referencedColumns list of Column instances on the referenced Table. Only col.getName() should be assumed to be correct
+ * @param uniqueReference true if there is no other references to the same table
+ * @return null if use defaults or non-empty String with a specific name
+ */
+ public String foreignKeyToInverseEntityName(String keyname, TableIdentifier fromTable, List fromColumnNames, TableIdentifier referencedTable, List referencedColumnNames, boolean uniqueReference);
+
/**
* @param table
* @return true if this table is considered to be a many-to-many table.
@@ -184,7 +194,7 @@
public boolean isOneToOne(ForeignKey foreignKey);
-
-
-
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey);
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey);
+
}
Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2009-02-20 16:11:57 UTC (rev 16011)
@@ -60,11 +60,6 @@
<!ATTLIST column type CDATA #IMPLIED >
<!ATTLIST column property CDATA #IMPLIED >
<!ATTLIST column exclude (true|false) "false" >
-<!-- too much flexibility to maintain; just use a foreign-key definition
-<!ATTLIST column foreign-catalog CDATA #IMPLIED >
-<!ATTLIST column foreign-schema CDATA #IMPLIED >
-<!ATTLIST column foreign-table CDATA #IMPLIED >
-<!ATTLIST column foreign-column CDATA #IMPLIED > -->
<!ELEMENT key-column EMPTY >
<!ATTLIST key-column name CDATA #REQUIRED >
@@ -97,20 +92,31 @@
<!ELEMENT many-to-one EMPTY >
<!ATTLIST many-to-one property CDATA #IMPLIED>
<!ATTLIST many-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST many-to-one cascade CDATA #IMPLIED>
+<!ATTLIST many-to-one fetch (join|select) #IMPLIED>
+<!ATTLIST many-to-one update (true|false) "true">
+<!ATTLIST many-to-one insert (true|false) "true">
<!-- pure one to one (shared pk) are managed) -->
<!ELEMENT one-to-one EMPTY >
<!ATTLIST one-to-one property CDATA #IMPLIED>
<!ATTLIST one-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST one-to-one cascade CDATA #IMPLIED>
+<!ATTLIST one-to-one fetch (join|select) #IMPLIED>
+
<!ELEMENT inverse-one-to-one EMPTY >
<!ATTLIST inverse-one-to-one property CDATA #IMPLIED>
<!ATTLIST inverse-one-to-one exclude (true|false) #IMPLIED>
+<!ATTLIST inverse-one-to-one cascade CDATA #IMPLIED>
+<!ATTLIST inverse-one-to-one fetch (join|select) #IMPLIED>
<!ELEMENT set EMPTY >
<!ATTLIST set property CDATA #IMPLIED>
<!ATTLIST set exclude (true|false) #IMPLIED>
+<!ATTLIST set cascade CDATA #IMPLIED>
+
<!-- <!ELEMENT bag EMPTY >
<!ATTLIST bag property CDATA #REQUIRED> -->
Modified: branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/templates/hbm/set.hbm.ftl 2009-02-20 16:11:57 UTC (rev 16011)
@@ -1,6 +1,9 @@
<set
name="${property.name}"
inverse="${property.value.inverse?string}"
+<#if property.cascade != "none">
+ cascade="${property.cascade}"
+</#if>
<#if !c2h.isOneToMany(property)>
table="${property.value.collectionTable.name}"
</#if>
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml 2009-02-20 16:11:57 UTC (rev 16011)
@@ -36,7 +36,7 @@
<property name="numberAvailable" type="int" column="`number-Available`"/>
- <set name="aSet">
+ <set name="aSet" cascade="delete, update">
<meta attribute="set-desc">anotherone</meta>
<key/>
<one-to-many class="Basic"/>
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/hbm2hbmxml/Hbm2HbmXmlTest.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -155,7 +155,38 @@
}
+
+ public void testCollectionAttributes() throws DocumentException {
+ File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/Basic.hbm.xml");
+ assertFileAndExists(outputXml);
+
+ SAXReader xmlReader = this.getSAXReader();
+
+ Document document = xmlReader.read(outputXml);
+ XPath xpath = DocumentHelper.createXPath("//hibernate-mapping/class/set");
+ List list = xpath.selectNodes(document);
+ assertEquals("Expected to get one set element", 1, list.size());
+ Element node = (Element) list.get(0);
+ assertEquals("delete, update", node.attributeValue("cascade"));
+
+
+
+// xpath = DocumentHelper.createXPath("//hibernate-mapping/class/property/meta");
+// list = xpath.selectNodes(document);
+// assertEquals("Expected to get one meta element", 1, list.size());
+// node = (Node) list.get(0);
+// assertEquals(node.getText(),"description");
+//
+// xpath = DocumentHelper.createXPath("//hibernate-mapping/class/set/meta");
+// list = xpath.selectNodes(document);
+// assertEquals("Expected to get one meta element", 1, list.size());
+// node = (Node) list.get(0);
+// assertEquals(node.getText(),"anotherone");
+
+
+ }
+
public void testComments() throws DocumentException {
File outputXml = new File(getOutputDir().getAbsolutePath() + "/org/hibernate/tool/hbm2x/hbm2hbmxml/ClassFullAttribute.hbm.xml");
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -29,7 +29,7 @@
*/
public class RevEngForeignKeyTests extends JDBCMetaDataBinderTestCase {
- private static final String OVERRIDETEST_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml";
+ private static final String FOREIGN_KEY_TEST_XML = "org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml";
private static final String BAD_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/badforeignkeytest.reveng.xml";;
public static Test suite() {
@@ -69,7 +69,7 @@
OverrideRepository or = buildOverrideRepository();
- or.addResource(OVERRIDETEST_FOREIGNKEY_XML);
+ or.addResource(FOREIGN_KEY_TEST_XML);
ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
@@ -91,8 +91,11 @@
assertNotNull(employee.getProperty("worksOns"));
assertNotNull("property should be renamed by reveng.xml", employee.getProperty("manager"));
assertPropertyNotExists( employee, "employees", "set should be excluded by reveng.xml" );
- assertNotNull("should be renamed by reveng.xml", employee.getProperty("managedProjects"));
+ Property setProperty = employee.getProperty("managedProjects");
+ assertNotNull("should be renamed by reveng.xml", setProperty);
+ assertEquals("delete, update", setProperty.getCascade());
+
assertEquals(4, employee.getPropertyClosureSpan());
assertEquals("id", employee.getIdentifierProperty().getName());
@@ -119,7 +122,7 @@
OverrideRepository or = buildOverrideRepository();
- or.addResource(OVERRIDETEST_FOREIGNKEY_XML);
+ or.addResource(FOREIGN_KEY_TEST_XML);
ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
@@ -134,10 +137,19 @@
assertPropertyNotExists(addressPerson, "person", "should be removed by reveng.xml");
assertPropertyNotExists(person, "addressPerson", "should be removed by reveng.xml");
- Property property = addressMultiPerson.getProperty("multiPerson");
+ Property property = addressMultiPerson.getProperty("renamedOne");
assertNotNull(property);
- assertPropertyNotExists(multiPerson, "addressMultiPerson", "should be removed by reveng.xml");
+ assertEquals("Casade should be set to delete by reveng.xml", "delete", property.getCascade());
+
+
+ assertPropertyNotExists(multiPerson, "addressMultiPerson", "should not be there");
+ Property o2o = multiPerson.getProperty("renamedInversedOne");
+ assertNotNull(o2o);
+
+ assertEquals("update", o2o.getCascade());
+ assertEquals("JOIN", o2o.getValue().getFetchMode().toString());
+
}
public void testDuplicateForeignKeyDefinition() {
@@ -159,6 +171,43 @@
}
+ public void testManyToOneAttributeDefaults() {
+
+ PersistentClass classMapping = cfg.getClassMapping("Employee");
+ Property property = classMapping.getProperty("employee");
+
+ assertEquals("none", property.getCascade());
+ assertEquals(true, property.isUpdateable());
+ assertEquals(true, property.isInsertable());
+ assertEquals("SELECT", property.getValue().getFetchMode().toString());
+
+ }
+
+ public void testManyToOneAttributeOverrides() {
+
+ OverrideRepository or = buildOverrideRepository();
+
+ or.addResource(FOREIGN_KEY_TEST_XML);
+ ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy());
+
+ JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration();
+ localCfg.setReverseEngineeringStrategy(repository);
+ localCfg.readFromJDBC();
+
+ PersistentClass classMapping = localCfg.getClassMapping("Employee");
+ Property property = classMapping.getProperty("manager");
+
+ assertEquals("all", property.getCascade());
+ assertEquals(false, property.isUpdateable());
+ assertEquals(false, property.isInsertable());
+ assertEquals("JOIN", property.getValue().getFetchMode().toString());
+
+
+ }
+
+
+
+
private void assertPropertyNotExists(PersistentClass employee, String name, String msg) {
try {
employee.getProperty(name);
Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2009-02-20 16:11:57 UTC (rev 16011)
@@ -7,7 +7,7 @@
<table name="EMPLOYEE">
<foreign-key constraint-name="EMPLOYEE_MANAGER">
- <many-to-one property="manager"/>
+ <many-to-one property="manager" cascade="all" update="false" insert="false" fetch="join"/>
<set exclude="true"/>
</foreign-key>
</table>
@@ -15,7 +15,7 @@
<table name="PROJECT">
<foreign-key constraint-name="PROJECT_MANAGER">
<many-to-one exclude="true"/>
- <set property="managedProjects"/>
+ <set property="managedProjects" cascade="delete, update"/>
</foreign-key>
</table>
@@ -28,8 +28,8 @@
<table name="ADDRESS_MULTI_PERSON">
<foreign-key constraint-name="ADDRESS_MULTI_PERSON">
- <one-to-one exclude="false"/>
- <inverse-one-to-one exclude="true"/>
+ <one-to-one property="renamedOne" exclude="false" cascade="delete"/>
+ <inverse-one-to-one property="renamedInversedOne" exclude="false" cascade="update" fetch="join"/>
</foreign-key>
</table>
Modified: branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2009-02-20 14:53:16 UTC (rev 16010)
+++ branches/Branch_3_2/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2009-02-20 16:11:57 UTC (rev 16011)
@@ -2,6 +2,7 @@
import java.util.Map;
import java.util.Properties;
+import org.hibernate.cfg.reveng.AssociationInfo;
import org.hibernate.cfg.reveng.ReverseEngineeringRuntimeInfo;
import org.hibernate.cfg.reveng.ReverseEngineeringSettings;
import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
@@ -167,4 +168,25 @@
// TODO Auto-generated method stub
return false;
}
+
+ @Override
+ public AssociationInfo foreignKeyToAssociationInfo(ForeignKey foreignKey) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String foreignKeyToInverseEntityName(String keyname,
+ TableIdentifier fromTable, List fromColumnNames,
+ TableIdentifier referencedTable, List referencedColumnNames,
+ boolean uniqueReference) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public AssociationInfo foreignKeyToInverseAssociationInfo(ForeignKey foreignKey) {
+ // TODO Auto-generated method stub
+ return null;
+ }
}
More information about the hibernate-commits
mailing list