From: <hib...@li...> - 2006-04-07 12:24:46
|
Author: max...@jb... Date: 2006-04-07 08:24:37 -0400 (Fri, 07 Apr 2006) New Revision: 9737 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java Log: HBX-615 exclude for <set> and <many-to-one> Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -172,10 +172,19 @@ private void bindIncomingForeignKeys(PersistentClass rc, Set processed, List foreignKeys, Mapping mapping) { if(foreignKeys!=null) { for (Iterator iter = foreignKeys.iterator(); iter.hasNext();) { - ForeignKey fk = (ForeignKey) iter.next(); + ForeignKey foreignKey = (ForeignKey) iter.next(); - Property property = bindOneToMany(rc, fk, processed, mapping); - rc.addProperty(property); + if(revengStrategy.excludeForeignKeyAsCollection( + foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + TableIdentifier.create(foreignKey.getReferencedTable() ), + foreignKey.getReferencedColumns())) { + log.debug("Rev.eng excluded one-to-many for foreignkey " + foreignKey.getName()); + } else { + Property property = bindOneToMany(rc, foreignKey, processed, mapping); + rc.addProperty(property); + } } } } @@ -198,8 +207,7 @@ value.addColumn(fkcolumn); processedColumns.add(fkcolumn); } - value.setFetchMode(FetchMode.SELECT); - + value.setFetchMode(FetchMode.SELECT); return makeProperty(propertyName, value, true, true, value.getFetchMode()!=FetchMode.JOIN, null, null); } @@ -219,10 +227,14 @@ boolean b = isUniqueReference(foreignKey); + TableIdentifier foreignKeyTable = TableIdentifier.create( foreignKey.getTable() ); + TableIdentifier foreignKeyReferencedTable = TableIdentifier.create( foreignKey.getReferencedTable() ); String collectionRole = revengStrategy.foreignKeyToCollectionName( foreignKey.getName(), - TableIdentifier.create( foreignKey.getTable() ), - foreignKey.getColumns(), TableIdentifier.create( foreignKey.getReferencedTable() ), foreignKey.getReferencedColumns(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns(), b ); collectionRole = makeUnique(rc,collectionRole); @@ -232,12 +244,20 @@ log.debug(fullRolePath + " found twice!"); } collection.setRole(fullRolePath); // Master.setOfChildren+ - collection.setInverse(true); // TODO: allow overriding this - collection.setLazy(true); // TODO: configurable + collection.setInverse(revengStrategy.isForeignKeyCollectionInverse(foreignKey.getName(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns())); // TODO: allow overriding this + collection.setLazy(revengStrategy.isForeignKeyCollectionLazy(foreignKey.getName(), + foreignKeyTable, + foreignKey.getColumns(), + foreignKeyReferencedTable, + foreignKey.getReferencedColumns())); collection.setFetchMode(FetchMode.SELECT); OneToMany oneToMany = new OneToMany( collection.getOwner() ); - oneToMany.setReferencedEntityName( revengStrategy.tableToClassName( TableIdentifier.create( foreignKey.getTable() ) ) ); // Child + oneToMany.setReferencedEntityName( revengStrategy.tableToClassName( foreignKeyTable ) ); // Child mappings.addSecondPass( new JDBCCollectionSecondPass(mappings, collection) ); collection.setElement(oneToMany); @@ -359,27 +379,35 @@ mutable = false; } - boolean isUnique = isUniqueReference(foreignKey); - String propertyName = revengStrategy.foreignKeyToEntityName( - foreignKey.getName(), - TableIdentifier.create(foreignKey.getTable() ), - foreignKey.getColumns(), - TableIdentifier.create(foreignKey.getReferencedTable() ), - foreignKey.getReferencedColumns(), - isUnique - ); - - Property property = bindManyToOne( - makeUnique(rc, propertyName), - table, - foreignKey, - processedColumns - ); - property.setUpdateable(mutable); - property.setInsertable(mutable); - - rc.addProperty(property); - + if(revengStrategy.excludeForeignKeyAsManytoOne(foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + 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()); + } else { + boolean isUnique = isUniqueReference(foreignKey); + String propertyName = revengStrategy.foreignKeyToEntityName( + foreignKey.getName(), + TableIdentifier.create(foreignKey.getTable() ), + foreignKey.getColumns(), + TableIdentifier.create(foreignKey.getReferencedTable() ), + foreignKey.getReferencedColumns(), + isUnique + ); + + Property property = bindManyToOne( + makeUnique(rc, propertyName), + table, + foreignKey, + processedColumns + ); + property.setUpdateable(mutable); + property.setInsertable(mutable); + + rc.addProperty(property); + } } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -182,5 +182,21 @@ public String tableToCompositeIdName(TableIdentifier identifier) { return null; } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return false; // TODO: default to true ? TODO: named include ? + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return false; + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return true; + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return true; + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DelegatingReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -88,5 +88,22 @@ public String tableToCompositeIdName(TableIdentifier identifier) { return delegate==null?null:delegate.tableToCompositeIdName(identifier); + } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return delegate==null?false:delegate.excludeForeignKeyAsCollection(keyname, fromTable, fromColumns, referencedTable, referencedColumns); + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + return delegate==null?false:delegate.excludeForeignKeyAsManytoOne(keyname, fromTable, fromColumns, referencedTable, referencedColumns); + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return delegate==null?true:delegate.isForeignKeyCollectionInverse(name, foreignKeyTable, columns, foreignKeyReferencedTable, referencedColumns); + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + return delegate==null?true:delegate.isForeignKeyCollectionLazy(name, foreignKeyTable, columns, foreignKeyReferencedTable, referencedColumns); } + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideBinder.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -151,23 +151,33 @@ if(StringHelper.isNotEmpty(constraintName)) { 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")); } - repository.addForeignKeyInfo(constraintName, manyToOneProperty, collectionProperty); + repository.addForeignKeyInfo(constraintName, manyToOneProperty, excludeManyToOne, collectionProperty, excludeCollection); } } } + private static Boolean BooleanValue(String string) { + if(string==null) return null; + return Boolean.valueOf(string); + } + private static String getValue(String first, String second) { if(first==null) { return second; @@ -198,7 +208,7 @@ repository.setTypeNameForColumn(tableIdentifier, column.getName(), element.attributeValue("type")); repository.setPropertyNameForColumn(tableIdentifier, column.getName(), element.attributeValue("property")); - boolean excluded = Boolean.valueOf(element.attributeValue("exclude")).booleanValue(); + boolean excluded = booleanValue( element.attributeValue("exclude") ); if(excluded) { repository.setExcludedColumn(tableIdentifier, column.getName()); } @@ -233,6 +243,10 @@ return columnNames; } + private static boolean booleanValue(String value) { + return Boolean.valueOf(value).booleanValue(); + } + private static void bindTableFilters(List filters, OverrideRepository respository) { Iterator iterator = filters.iterator(); Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/OverrideRepository.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -63,6 +63,10 @@ final private Map foreignKeyToEntityName; final private Map foreignKeyToCollectionName; + + final private Map foreignKeyCollectionExclude; + + final private Map foreignKeyManyToOneExclude; //private String defaultCatalog; //private String defaultSchema; @@ -88,6 +92,8 @@ compositeIdNameForTable = new HashMap(); foreignKeyToEntityName = new HashMap(); foreignKeyToCollectionName = new HashMap(); + foreignKeyCollectionExclude = new HashMap(); + foreignKeyManyToOneExclude = new HashMap(); } public OverrideRepository addFile(File xmlFile) { @@ -397,6 +403,26 @@ return property; } } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + Boolean bool = (Boolean) foreignKeyCollectionExclude.get(keyname); + if(bool!=null) { + return bool.booleanValue(); + } else { + return super.excludeForeignKeyAsCollection( keyname, fromTable, fromColumns, + referencedTable, referencedColumns ); + } + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + Boolean bool = (Boolean) foreignKeyManyToOneExclude.get(keyname); + if(bool!=null) { + return bool.booleanValue(); + } else { + return super.excludeForeignKeyAsManytoOne( keyname, fromTable, fromColumns, + referencedTable, referencedColumns ); + } + } }; } @@ -483,13 +509,19 @@ schemaSelections.add(schemaSelection); } - public void addForeignKeyInfo(String constraintName, String manyToOneProperty, String collectionProperty) { + public void addForeignKeyInfo(String constraintName, String manyToOneProperty, Boolean excludeManyToOne, String collectionProperty, Boolean excludeCollection) { if(StringHelper.isNotEmpty(manyToOneProperty)) { foreignKeyToEntityName.put(constraintName, manyToOneProperty); } if(StringHelper.isNotEmpty(collectionProperty)) { foreignKeyToCollectionName.put(constraintName, collectionProperty); } + if(excludeCollection!=null) { + foreignKeyCollectionExclude.put(constraintName, excludeCollection); + } + if(excludeManyToOne!=null) { + foreignKeyManyToOneExclude.put(constraintName, excludeManyToOne); + } } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -21,6 +21,18 @@ */ public String columnToPropertyName(TableIdentifier table, String column); + /** Should this foreignkey be used as a oneToMany */ + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns); + + /** Should this foreignkey be used as a many-to-one */ + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns); + + /** is the collection inverse or not ? */ + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns); + + /** is the collection lazy or not ? */ + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns); + /** * Return a collection role name for a Collection based on the foreignkey. * @param fromColumns list of Column instances on the fromTable. Only col.getName() should be assumed to be correct @@ -114,5 +126,9 @@ public String tableToCompositeIdName(TableIdentifier identifier); + + + + } Modified: trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/java/org/hibernate/hibernate-reverse-engineering-3.0.dtd 2006-04-07 12:24:37 UTC (rev 9737) @@ -83,21 +83,25 @@ <!ELEMENT param (#PCDATA)> <!ATTLIST param name CDATA #REQUIRED> -<!ELEMENT foreign-key (column-ref+,many-to-one?,(set)?) > +<!-- A foreign-key has to have at least a constraint-name AND/OR foreign-table+column-ref's --> +<!ELEMENT foreign-key (column-ref*,many-to-one?,(set)?) > <!ATTLIST foreign-key constraint-name CDATA #IMPLIED > <!ATTLIST foreign-key foreign-catalog CDATA #IMPLIED > <!ATTLIST foreign-key foreign-schema CDATA #IMPLIED > -<!ATTLIST foreign-key foreign-table CDATA #REQUIRED > +<!ATTLIST foreign-key foreign-table CDATA #IMPLIED > <!ELEMENT column-ref EMPTY > <!ATTLIST column-ref local-column CDATA #REQUIRED > <!ATTLIST column-ref foreign-column CDATA #IMPLIED > <!ELEMENT many-to-one EMPTY > -<!ATTLIST many-to-one property CDATA #REQUIRED> +<!ATTLIST many-to-one property CDATA #IMPLIED> +<!ATTLIST many-to-one exclude (true|false) #IMPLIED> + <!ELEMENT set EMPTY > -<!ATTLIST set property CDATA #REQUIRED> +<!ATTLIST set property CDATA #IMPLIED> +<!ATTLIST set exclude (true|false) #IMPLIED> <!-- <!ELEMENT bag EMPTY > <!ATTLIST bag property CDATA #REQUIRED> --> Modified: trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java =================================================================== --- trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 08:13:46 UTC (rev 9736) +++ trunk/HibernateExt/tools/src/testsupport/NoopReverseEngineeringStrategy.java 2006-04-07 12:24:37 UTC (rev 9737) @@ -114,4 +114,24 @@ // TODO Auto-generated method stub return null; } + + public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } + + public boolean isForeignKeyCollectionLazy(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { + // TODO Auto-generated method stub + return false; + } } |