Author: max...@jb... Date: 2006-04-18 12:45:06 -0400 (Tue, 18 Apr 2006) New Revision: 9761 Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml Log: more tests for foreignkey handling introduce per-reverseengineering settings for some of the handling 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-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java 2006-04-18 16:45:06 UTC (rev 9761) @@ -20,7 +20,7 @@ private static Set AUTO_OPTIMISTICLOCK_COLUMNS; - private ReverseEngineeringSettings settings; + private ReverseEngineeringSettings settings = new ReverseEngineeringSettings(); static { AUTO_OPTIMISTICLOCK_COLUMNS = new HashSet(); AUTO_OPTIMISTICLOCK_COLUMNS.add("version"); @@ -31,7 +31,7 @@ public DefaultReverseEngineeringStrategy() { super(); } - + public String columnToPropertyName(TableIdentifier table, String columnName) { String decapitalize = Introspector.decapitalize( toUpperCamelCase(columnName) ); @@ -155,7 +155,7 @@ } public boolean useColumnForOptimisticLock(TableIdentifier identifier, String column) { - if(settings.hasDefaultOptimisticLockDetection()) { + if(settings.hasAutoOptimisticLockDetection()) { return AUTO_OPTIMISTICLOCK_COLUMNS.contains(column.toLowerCase())?true:false; } else { return false; @@ -175,11 +175,11 @@ } public boolean excludeForeignKeyAsCollection(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { - return false; // TODO: default to true ? TODO: named include ? + return !settings.createCollectionForForeignKey(); } public boolean excludeForeignKeyAsManytoOne(String keyname, TableIdentifier fromTable, List fromColumns, TableIdentifier referencedTable, List referencedColumns) { - return false; + return !settings.createManyToOneForForeignKey(); } public boolean isForeignKeyCollectionInverse(String name, TableIdentifier foreignKeyTable, List columns, TableIdentifier foreignKeyReferencedTable, List referencedColumns) { Modified: trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java =================================================================== --- trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-04-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringSettings.java 2006-04-18 16:45:06 UTC (rev 9761) @@ -5,8 +5,10 @@ //final ReverseEngineeringStrategy rootStrategy; - String defaultPackageName = ""; - private boolean defaultOptimisticLockDetection = true; + private String defaultPackageName = ""; + private boolean autoOptimisticLockDetection = true; + private boolean createCollectionForForeignKey = true; + private boolean createManyToOneForForeignKey = true; //public ReverseEngineeringSettings(ReverseEngineeringStrategy rootStrategy) { // this.rootStrategy = rootStrategy; @@ -26,16 +28,39 @@ return defaultPackageName; } - public boolean hasDefaultOptimisticLockDetection() { - return defaultOptimisticLockDetection ; + /** If true, reverse engineering strategy will try and autodetect columns for optimistc locking, e.g. VERSION and TIMESTAMP */ + public boolean hasAutoOptimisticLockDetection() { + return autoOptimisticLockDetection ; } - public void setDefaultOptimisticLockDetection( + public void setAutoOptimisticLockDetection( boolean optimisticLockSupportEnabled) { - this.defaultOptimisticLockDetection = optimisticLockSupportEnabled; + this.autoOptimisticLockDetection = optimisticLockSupportEnabled; } + + /** if true, a collection will be mapped for each foreignkey */ + public boolean createCollectionForForeignKey() { + return createCollectionForForeignKey; + } + public ReverseEngineeringSettings setCreateCollectionForForeignKey( + boolean createCollectionForForeignKey) { + this.createCollectionForForeignKey = createCollectionForForeignKey; + return this; + } + + /** if true, a many-to-one association will be created for each foreignkey found */ + public boolean createManyToOneForForeignKey() { + return createManyToOneForForeignKey; + } + + public ReverseEngineeringSettings setCreateManyToOneForForeignKey( + boolean createManyToOneForForeignKey) { + this.createManyToOneForForeignKey = createManyToOneForForeignKey; + return this; + } + /** return the top/root strategy. Allows a lower strategy to ask another question. Dangerous to do since recursive loops can easily occur! */ /*public ReverseEngineeringStrategy getRootStrategy() { return rootStrategy; Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-04-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/JDBCMetaDataBinderTestCase.java 2006-04-18 16:45:06 UTC (rev 9761) @@ -129,7 +129,7 @@ } protected void tearDown() throws Exception { - executeDDL(getDropSQL(), true ); + executeDDL(getDropSQL(), false); super.tearDown(); } /** Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-04-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/GenerateFromJDBCTest.java 2006-04-18 16:45:06 UTC (rev 9761) @@ -5,7 +5,9 @@ package org.hibernate.tool.hbm2x; import java.io.File; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentException; @@ -16,6 +18,7 @@ import org.hibernate.cfg.Configuration; import org.hibernate.cfg.JDBCMetaDataConfiguration; import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy; +import org.hibernate.cfg.reveng.ReverseEngineeringSettings; import org.hibernate.mapping.PersistentClass; import org.hibernate.tool.JDBCMetaDataBinderTestCase; import org.hibernate.tool.test.TestHelper; @@ -52,7 +55,7 @@ protected void configure(JDBCMetaDataConfiguration cfg2configure) { DefaultReverseEngineeringStrategy configurableNamingStrategy = new DefaultReverseEngineeringStrategy(); - configurableNamingStrategy.setPackageName("org.reveng"); + configurableNamingStrategy.setSettings(new ReverseEngineeringSettings().setDefaultPackageName("org.reveng").setCreateCollectionForForeignKey(false)); cfg2configure.setReverseEngineeringStrategy(configurableNamingStrategy); } @@ -136,7 +139,7 @@ // Validate the Generator and it has no arguments XPath xpath = DocumentHelper.createXPath("//hibernate-configuration/session-factory/mapping"); Element[] elements = (Element[]) xpath.selectNodes(document).toArray(new Element[0]); - assertEquals("Expected to get one mapping", elements.length , 2); + assertEquals(2, elements.length); for (int i = 0; i < elements.length; i++) { Element element = elements[i]; Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2006-04-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/RevEngForeignKeyTests.java 2006-04-18 16:45:06 UTC (rev 9761) @@ -27,6 +27,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 BAD_FOREIGNKEY_XML = "org/hibernate/tool/test/jdbc2cfg/badforeignkeytest.reveng.xml";; public static Test suite() { return new TestSuite(RevEngForeignKeyTests.class); @@ -100,7 +101,26 @@ assertEquals("id", worksOn.getIdentifierProperty().getName()); } + + public void testDuplicateForeignKeyDefinition() { + + OverrideRepository or = buildOverrideRepository(); + + or.addResource(BAD_FOREIGNKEY_XML); + ReverseEngineeringStrategy repository = or.getReverseEngineeringStrategy(new DefaultReverseEngineeringStrategy()); + JDBCMetaDataConfiguration localCfg = new JDBCMetaDataConfiguration(); + localCfg.setReverseEngineeringStrategy(repository); + + try { + localCfg.readFromJDBC(); + fail("Should fail because foreign key is already defined in the database"); // maybe we should ignore the definition and only listen to what is overwritten ? For now we error. + } catch(MappingException me) { + assertTrue(me.getMessage().indexOf("already defined")>=0); + } + + } + private void assertPropertyNotExists(PersistentClass employee, String name, String msg) { try { employee.getProperty(name); @@ -124,7 +144,7 @@ return new String[] { "create table PROJECT ( project_id integer not null, name varchar(50), team_lead integer, primary key (project_id) )", "create table EMPLOYEE ( id integer not null, name varchar(50), manager_id integer, primary key (id), constraint employee_manager foreign key (manager_id) references EMPLOYEE)", - "create table WORKS_ON ( project_id integer not null, employee_id integer not null, start_date date, end_date date, primary key (project_id, employee_id), foreign key (employee_id) references EMPLOYEE, foreign key (project_id) references PROJECT )", + "create table WORKS_ON ( project_id integer not null, employee_id integer not null, start_date date, end_date date, primary key (project_id, employee_id), constraint workson_employee foreign key (employee_id) references EMPLOYEE, foreign key (project_id) references PROJECT )", "alter table PROJECT add constraint project_manager foreign key (team_lead) references EMPLOYEE" }; } Modified: trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml =================================================================== --- trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2006-04-18 16:44:02 UTC (rev 9760) +++ trunk/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/foreignkeytest.reveng.xml 2006-04-18 16:45:06 UTC (rev 9761) @@ -15,6 +15,6 @@ <many-to-one exclude="true"/> <set property="managedProjects"/> </foreign-key> - </table> + </table> </hibernate-reverse-engineering> \ No newline at end of file |