[hibernate-commits] Hibernate SVN: r11422 - in branches/Branch_3_2/HibernateExt/tools/src: java/org/hibernate/cfg/reveng and 5 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Apr 23 08:58:03 EDT 2007


Author: max.andersen at jboss.com
Date: 2007-04-23 08:58:03 -0400 (Mon, 23 Apr 2007)
New Revision: 11422

Added:
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AbstractDatabaseCollector.java
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/AbstractIdentityTest.java
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/H2IdentityTest.java
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/MySQLIdentityTest.java
Removed:
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MySQLAutoIncrementTest.java
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/JDBCReaderFactory.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DatabaseCollector.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultDatabaseCollector.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/JDBCReader.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/MappingsDatabaseCollector.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringRuntimeInfo.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/cfg/reveng/dialect/H2MetaDataDialect.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/MySQLMetaDataDialect.java
   branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java
   branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/CachedMetaDataTest.java
Log:
HBX-925 Auto-detect identifier strategy
HBX-926 MySQLMetaDataDialect for identifier strategy
HBX-935 H2MetaDataDialect for identifier strategy

(had to break some semi-public api for this ;(

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	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCBinder.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -85,9 +85,8 @@
 				
 		try {
 			
-			Map oneToManyCandidates = readDatabaseSchema(catalog, schema); 
-			
-			createPersistentClasses(oneToManyCandidates, mapping); //move this to a different step!
+			DatabaseCollector collector = readDatabaseSchema(catalog, schema); 
+			createPersistentClasses(collector, mapping); //move this to a different step!
 		} 
 		catch (SQLException e) {
 			throw settings.getSQLExceptionConverter().convert(e, "Reading from database", null);
@@ -101,13 +100,12 @@
 	/**
 	 * Read JDBC Metadata from the database. Does not create any classes or other ORM releated structures.
 	 * 
-	 * @deprecated should use readDatabaseSchema(DatabaseCollector, catalog, schema)
 	 * @param catalog
 	 * @param schema
 	 * @return 
 	 * @throws SQLException
 	 */
-	public Map readDatabaseSchema(String catalog, String schema) throws SQLException {
+	public DatabaseCollector readDatabaseSchema(String catalog, String schema) throws SQLException {
 	  	 // use default from settings if nothing else specified.
 	     catalog = catalog!=null ? catalog : settings.getDefaultCatalogName();
 	     schema = schema!=null ? schema : settings.getDefaultSchemaName();
@@ -115,7 +113,7 @@
 	     JDBCReader reader = JDBCReaderFactory.newJDBCReader(cfg.getProperties(),settings,revengStrategy);
 	     DatabaseCollector dbs = new MappingsDatabaseCollector(mappings); 
 	     reader.readDatabaseSchema(dbs, catalog, schema);
-	     return dbs.getOneToManyCandidates();
+	     return dbs;
 	}
 
 
@@ -124,8 +122,9 @@
 	 * @param manyToOneCandidates
 	 * @param mappings2
 	 */
-	private void createPersistentClasses(Map manyToOneCandidates, Mapping mapping) {
-		
+	private void createPersistentClasses(DatabaseCollector collector, Mapping mapping) {
+		Map manyToOneCandidates = collector.getOneToManyCandidates();
+	
 		for (Iterator iter = mappings.iterateTables(); iter.hasNext();) {
 			Table table = (Table) iter.next();
 			if(table.getColumnSpan()==0) {
@@ -170,7 +169,7 @@
 			
 			Set processed = new HashSet();
             
-			bindPrimaryKeyToProperties(table, rc, processed, mapping);
+			bindPrimaryKeyToProperties(table, rc, processed, mapping, collector);
 			bindColumnsToVersioning(table, rc, processed, mapping);
 			bindOutgoingForeignKeys(table, rc, processed);
 			bindColumnsToProperties(table, rc, processed, mapping);
@@ -399,7 +398,7 @@
 		return true;
 	}
 
-	private void bindPrimaryKeyToProperties(Table table, RootClass rc, Set processed, Mapping mapping) {
+	private void bindPrimaryKeyToProperties(Table table, RootClass rc, Set processed, Mapping mapping, DatabaseCollector collector) {
 		SimpleValue id = null;
 		String idPropertyname = null;
 		
@@ -419,7 +418,7 @@
 
 		final TableIdentifier tableIdentifier = TableIdentifier.create(table);
 		
-		String tableIdentifierStrategyName = null;
+		String tableIdentifierStrategyName;
 		
 		boolean naturalId;
 		
@@ -434,7 +433,16 @@
 			}
 		} 
 		else {
-			tableIdentifierStrategyName = revengStrategy.getTableIdentifierStrategyName(tableIdentifier);
+			tableIdentifierStrategyName = "assigned";
+			String suggestedStrategy = revengStrategy.getTableIdentifierStrategyName(tableIdentifier);
+			if(suggestedStrategy==null) {
+				suggestedStrategy = collector.getSuggestedIdentifierStrategy( tableIdentifier.getCatalog(), tableIdentifier.getSchema(), tableIdentifier.getName() );
+				if(suggestedStrategy==null) {
+					suggestedStrategy = "assigned";
+				}
+				tableIdentifierStrategyName = suggestedStrategy;
+			}			
+			
 			naturalId = "assigned".equals( tableIdentifierStrategyName );
 			Column pkc = (Column) keyColumns.get(0);
 			checkColumn(pkc);

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/JDBCReaderFactory.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -4,8 +4,15 @@
 
 import org.hibernate.cfg.reveng.JDBCReader;
 import org.hibernate.cfg.reveng.ReverseEngineeringStrategy;
+import org.hibernate.cfg.reveng.dialect.H2MetaDataDialect;
 import org.hibernate.cfg.reveng.dialect.JDBCMetaDataDialect;
 import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
+import org.hibernate.cfg.reveng.dialect.OracleMetaDataDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.dialect.Oracle9Dialect;
 import org.hibernate.util.ReflectHelper;
 
 final public class JDBCReaderFactory {
@@ -14,18 +21,17 @@
 	public static JDBCReader newJDBCReader(Properties cfg, Settings settings,
 			ReverseEngineeringStrategy revengStrategy) {
 
-		MetaDataDialect mdd = newMetaDataDialect( cfg );
+		MetaDataDialect mdd = newMetaDataDialect( settings.getDialect(), cfg );
 
 		return newJDBCReader( settings, revengStrategy, mdd );
 	}
 
-	public static JDBCReader newJDBCReader(Settings settings, ReverseEngineeringStrategy revengStrategy, MetaDataDialect mdd) {
+	public static JDBCReader newJDBCReader(Settings settings, ReverseEngineeringStrategy revengStrategy, MetaDataDialect mdd) {	
 		return new JDBCReader( mdd, settings.getConnectionProvider(), settings
 				.getSQLExceptionConverter(), settings.getDefaultCatalogName(), settings.getDefaultSchemaName(), revengStrategy );
 	}
 
-	//TODO: how to get the current dialect to decide depenendent on the dialect.
-	public static MetaDataDialect newMetaDataDialect(Properties cfg) {
+	public static MetaDataDialect newMetaDataDialect(Dialect dialect, Properties cfg) {		
 		String property = cfg.getProperty( "hibernatetool.metadatadialect" );
 		if ( property != null ) {
 			try {
@@ -37,6 +43,15 @@
 						"Could not load MetaDataDialect: " + property, e );
 			}
 		}
+		if(dialect!=null) { // temporary hack to enable dialect specific metadata dialects. 
+			if(dialect instanceof Oracle9Dialect) {
+				return new OracleMetaDataDialect();
+			} else if (dialect instanceof H2Dialect) {
+				return new H2MetaDataDialect();
+			} else if (dialect instanceof MySQLDialect) {
+				return new MySQLMetaDataDialect();
+			}
+		}
 		return new JDBCMetaDataDialect();
 	}
 

Added: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AbstractDatabaseCollector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AbstractDatabaseCollector.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/AbstractDatabaseCollector.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -0,0 +1,33 @@
+package org.hibernate.cfg.reveng;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class AbstractDatabaseCollector implements DatabaseCollector {
+
+	private Map oneToManyCandidates;
+	protected final Map suggestedIdentifierStrategies;
+
+	public AbstractDatabaseCollector() {
+		suggestedIdentifierStrategies = new HashMap();
+	}
+	
+	public void setOneToManyCandidates(Map oneToManyCandidates) {
+		this.oneToManyCandidates = oneToManyCandidates;
+	}
+
+	public Map getOneToManyCandidates() {
+		return oneToManyCandidates;
+	}
+
+	public String getSuggestedIdentifierStrategy(String catalog, String schema, String name) {
+		TableIdentifier identifier = new TableIdentifier(catalog, schema, name);
+		return (String) suggestedIdentifierStrategies.get(identifier);
+	}
+
+	public void addSuggestedIdentifierStrategy(String catalog, String schema, String name, String idstrategy) {
+		TableIdentifier identifier = new TableIdentifier(catalog, schema, name);
+		suggestedIdentifierStrategies.put(identifier, idstrategy);
+	}
+
+}

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DatabaseCollector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DatabaseCollector.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DatabaseCollector.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -5,18 +5,25 @@
 
 import org.hibernate.mapping.Table;
 
+// split up to readonly/writeable interface
+/**
+ * Only intended to be used internally in reveng. *not* public api.
+ */
 public interface DatabaseCollector {
 
-	public abstract Iterator iterateTables();
+	public Iterator iterateTables();
 
-	public abstract Table addTable(String schema, String catalog, String name);
+	public Table addTable(String schema, String catalog, String name);
 
-	public abstract void setOneToManyCandidates(Map oneToManyCandidates);
+	public void setOneToManyCandidates(Map oneToManyCandidates);
 
-	public abstract Table getTable(String schema, String catalog, String name);
+	public Table getTable(String schema, String catalog, String name);
 
-	public abstract Map getOneToManyCandidates();
+	public Map getOneToManyCandidates();
 
-	//TODO: add identifier strategy suggestions here ?
+	public void addSuggestedIdentifierStrategy(String catalog, String schema, String name, String strategy);
 	
+	public String getSuggestedIdentifierStrategy(String catalog, String schema, String name);
+	
+	
 }
\ No newline at end of file

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultDatabaseCollector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultDatabaseCollector.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultDatabaseCollector.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -9,23 +9,17 @@
 import org.hibernate.mapping.Table;
 import org.hibernate.util.StringHelper;
 
-public class DefaultDatabaseCollector implements DatabaseCollector  {
+public class DefaultDatabaseCollector extends AbstractDatabaseCollector  {
 
-	Map tables;
-		
-	Map qualifiers;
-	
-	static class TableContainer {
-		List tables = new ArrayList();
-	}
-	
+	private Map tables;		
+	private Map qualifiers;
 	public DefaultDatabaseCollector() {
 		tables = new HashMap();
 		qualifiers = new HashMap();		
 	}
 	
-	private Map oneToManyCandidates;
 	
+	
 	public Iterator iterateTables() {
 		return tables.values().iterator();
 	}
@@ -60,19 +54,11 @@
 		return table;
 	}
 
-	public void setOneToManyCandidates(Map oneToManyCandidates) {
-		this.oneToManyCandidates = oneToManyCandidates;
-	}
-
 	public Table getTable(String schema, String catalog, String name) {
         String key = Table.qualify(catalog, schema, name);
 		return (Table) tables.get(key);
 	}
 
-	public Map getOneToManyCandidates() {
-		return oneToManyCandidates;
-	}
-
 	public Iterator getQualifierEntries() {
 		return qualifiers.entrySet().iterator();
 	}

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	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/DefaultReverseEngineeringStrategy.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -144,21 +144,7 @@
 	}
 
 	public String getTableIdentifierStrategyName(TableIdentifier identifier) {
-		String suggestion = null;
-		if(runtimeInfo!=null) {
-			Iterator iterator = runtimeInfo.getMetadataDialect().getSuggestedPrimaryKeyStrategyName(identifier.getCatalog(), identifier.getSchema(), identifier.getName());
-			if(iterator.hasNext()) {
-				Map m = (Map) iterator.next();
-				suggestion = (String) m.get( "HIBERNATE_STRATEGY" );
-			}
-			runtimeInfo.getMetadataDialect().close(iterator);
-		}
-		
-		if(StringHelper.isEmpty( suggestion )) {
-			return "assigned";	
-		} else {
-			return suggestion;
-		}
+		return null;
 	}
 
 	public Properties getTableIdentifierProperties(TableIdentifier identifier) {

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/JDBCReader.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -62,8 +62,9 @@
 		
 	public List readDatabaseSchema(DatabaseCollector dbs, String catalog, String schema, ProgressListener progress) {
 		try {
-			getMetaDataDialect().configure(provider, sec);
-			revengStrategy.configure(new ReverseEngineeringRuntimeInfo(provider, sec, metadataDialect));
+			ReverseEngineeringRuntimeInfo info = new ReverseEngineeringRuntimeInfo(provider, sec, dbs);
+			getMetaDataDialect().configure(info.getConnectionProvider(), info.getSQLExceptionConverter());
+			revengStrategy.configure(info);
 			
 			Set hasIndices = new HashSet();
 			
@@ -82,7 +83,7 @@
 			while ( tables.hasNext() ) {
 				Table table = (Table) tables.next();
 				processBasicColumns(table, progress);
-				processPrimaryKey(table);
+				processPrimaryKey(dbs, table);
 				if(hasIndices.contains(table)) {
 					processIndices(table);
 				}
@@ -315,6 +316,7 @@
 
 	
 	/**
+	 * @param dbs 
 	 * @param catalog
 	 * @param schema
 	 * @param table
@@ -322,8 +324,8 @@
 	 * @return
 	 * @throws SQLException
 	 */
-	private void processPrimaryKey(Table table) {
-		
+	private void processPrimaryKey(DatabaseCollector dbs, Table table) {
+				
 		List columns = new ArrayList();
 		PrimaryKey key = null;
 		Iterator primaryKeyIterator = null;
@@ -393,7 +395,7 @@
 			t.add(element[1]);
 	      }
 	      columns = t;
-			      
+	      
 	      if(key==null) {
 	      	log.warn("The JDBC driver didn't report any primary key columns in " + table.getName() + ". Asking rev.eng. strategy" );
 	      	List userPrimaryKey = revengStrategy.getPrimaryKeyColumnNames(TableIdentifier.create(table));
@@ -410,7 +412,16 @@
 	      		log.warn("Rev.eng. strategy did not report any primary key columns for " + table.getName());
 	      	}	      	
 	      }
-	      
+
+	      Iterator suggestedPrimaryKeyStrategyName = getMetaDataDialect().getSuggestedPrimaryKeyStrategyName( getCatalogForDBLookup(table.getCatalog()), getSchemaForDBLookup(table.getSchema()), table.getName() );	      
+	      if(suggestedPrimaryKeyStrategyName.hasNext()) {
+	    	  Map m = (Map) suggestedPrimaryKeyStrategyName.next();
+	    	  String suggestion = (String) m.get( "HIBERNATE_STRATEGY" );
+	    	  if(suggestion!=null) {
+	    		  dbs.addSuggestedIdentifierStrategy( table.getCatalog(), table.getSchema(), table.getName(), suggestion );
+	    	  }
+	      }
+	      	      
 	      if(key!=null) {
 	    	  cols = columns.iterator();
 	    	  while (cols.hasNext() ) {
@@ -421,11 +432,7 @@
 	    	  }
 	    	  log.debug("primary key for " + table + " -> "  + key);
 	      } 
-	     
-	      	     
-	      	
-	      
-		
+	     	      
 	}
 
 	private boolean safeEquals(Object value, Object tf) {

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/MappingsDatabaseCollector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/MappingsDatabaseCollector.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/MappingsDatabaseCollector.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -1,16 +1,14 @@
 package org.hibernate.cfg.reveng;
 
 import java.util.Iterator;
-import java.util.Map;
 
 import org.hibernate.cfg.Mappings;
 import org.hibernate.mapping.Table;
 
-public class MappingsDatabaseCollector implements DatabaseCollector {
+public class MappingsDatabaseCollector extends AbstractDatabaseCollector {
 
 	private final Mappings mappings;
-	private Map oneToManyCandidates;
-
+	
 	public MappingsDatabaseCollector(Mappings mappings) {
 		this.mappings = mappings;
 	}
@@ -23,15 +21,8 @@
 		return mappings.addTable(schema, catalog, name, null, false);
 	}
 
-	public void setOneToManyCandidates(Map oneToManyCandidates) {
-		this.oneToManyCandidates = oneToManyCandidates;
-	}
-
 	public Table getTable(String schema, String catalog, String name) {
 		return mappings.getTable(schema, catalog, name);
 	}
 
-	public Map getOneToManyCandidates() {
-		return oneToManyCandidates;
-	}
 }

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringRuntimeInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringRuntimeInfo.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringRuntimeInfo.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -1,6 +1,5 @@
 package org.hibernate.cfg.reveng;
 
-import org.hibernate.cfg.reveng.dialect.MetaDataDialect;
 import org.hibernate.connection.ConnectionProvider;
 import org.hibernate.exception.SQLExceptionConverter;
 
@@ -15,12 +14,10 @@
 
 	private final ConnectionProvider connectionProvider;
 	private final SQLExceptionConverter SQLExceptionConverter;
-	private final MetaDataDialect metadataDialect;
-
-	protected ReverseEngineeringRuntimeInfo(ConnectionProvider provider, SQLExceptionConverter sec, MetaDataDialect metadataDialect) {
+	
+	protected ReverseEngineeringRuntimeInfo(ConnectionProvider provider, SQLExceptionConverter sec, DatabaseCollector dbs) {
 		this.connectionProvider = provider;
-		this.SQLExceptionConverter = sec;
-		this.metadataDialect = metadataDialect;
+		this.SQLExceptionConverter = sec;	
 	}
 	
 	public ConnectionProvider getConnectionProvider() {
@@ -31,8 +28,6 @@
 		return SQLExceptionConverter;
 	}
 	
-	public MetaDataDialect getMetadataDialect() {
-		return metadataDialect;
-	}
+	
 		
 }

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	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/ReverseEngineeringStrategy.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -72,6 +72,10 @@
 	 */
 	public List getForeignKeys(TableIdentifier referencedTable);
 
+	/** 
+	 * @param identifier the table to look up for
+	 * @return the identifier strategy name wanted for a specific table, null if use what the database metadata can tell. 
+	 */
 	public String getTableIdentifierStrategyName(TableIdentifier identifier);
 
 	public Properties getTableIdentifierProperties(TableIdentifier identifier);

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/H2MetaDataDialect.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/H2MetaDataDialect.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/H2MetaDataDialect.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -1,10 +1,15 @@
 package org.hibernate.cfg.reveng.dialect;
 
+import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 
+import org.hibernate.util.StringHelper;
 
+
 /**
  * MetaData dialect that work around tweaks in the H2 database. 
  * 
@@ -13,7 +18,7 @@
  */
 public class H2MetaDataDialect extends JDBCMetaDataDialect {
 
-	protected void putTablePart(Map element, ResultSet tableRs) throws SQLException {		
+	/*protected void putTablePart(Map element, ResultSet tableRs) throws SQLException {		
 		super.putTablePart( element, tableRs );
 		element.put("TABLE_CAT", null);
 	}
@@ -22,6 +27,55 @@
 		super.putExportedKeysPart( element, rs );
 		element.put( "PKTABLE_CAT", null);
 		element.put( "FKTABLE_CAT", null);
+	}*/
+	
+	public Iterator getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String table) {
+			try {			
+				catalog = caseForSearch( catalog );
+				schema = caseForSearch( schema );
+				table = caseForSearch( table );
+				
+				log.debug("getTables(" + catalog + "." + schema + "." + table + ")");
+				
+				String sql =  "SELECT idx.TABLE_CATALOG TABLE_CAT, idx.TABLE_SCHEMA TABLE_SCHEM, idx.TABLE_NAME, idx.COLUMN_NAME, cols.COLUMN_DEFAULT COLUMN_DEFAULT FROM " +
+						"INFORMATION_SCHEMA.INDEXES idx, INFORMATION_SCHEMA.COLUMNS cols " +
+						"WHERE " +
+						"idx.TABLE_CATALOG = cols.TABLE_CATALOG " +
+						"and idx.TABLE_SCHEMA = cols.TABLE_SCHEMA " +
+						"and idx.TABLE_NAME = cols.TABLE_NAME " +
+                        "AND idx.PRIMARY_KEY = TRUE " +
+                        "AND COLUMN_DEFAULT like '%NEXT VALUE FOR%' ";				
+				if(catalog!=null) {
+					sql += "AND idx.TABLE_CATNAME like '" + catalog + "' ";
+				}
+				if(schema!=null) { 					
+					sql += "AND idx.TABLE_SCHEMA like '" + schema + "' ";
+				}
+				if(table!=null) {
+					sql += "AND idx.TABLE_NAME like '" + table + "' ";
+				}
+									
+				PreparedStatement statement = getConnection().prepareStatement( sql );
+				
+				return new ResultSetIterator(statement.executeQuery(), getSQLExceptionConverter()) {
+					
+					Map element = new HashMap();
+					protected Object convertRow(ResultSet tableRs) throws SQLException {
+						element.clear();
+						putTablePart( element, tableRs );
+						String string = tableRs.getString("COLUMN_DEFAULT");
+						element.put("HIBERNATE_STRATEGY", StringHelper.isEmpty( string )?null:"identity");						
+						return element;					
+					}
+					protected Throwable handleSQLException(SQLException e) {
+						// schemaRs and catalogRs are only used for error reporting if
+						// we get an exception
+						throw getSQLExceptionConverter().convert( e,
+								"Could not get list of suggested identity strategies from database. Probably a JDBC driver problem. ", null );					
+					}
+				};
+			} catch (SQLException e) {
+				throw getSQLExceptionConverter().convert(e, "Could not get list of tables from database. Probably a JDBC driver problem.", null);		         
+			} 		
 	}
-	
 }

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/MySQLMetaDataDialect.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/MySQLMetaDataDialect.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/cfg/reveng/dialect/MySQLMetaDataDialect.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -9,7 +9,12 @@
 
 public class MySQLMetaDataDialect extends JDBCMetaDataDialect {
 
+	/**
+	 * Based on info from http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html
+	 * Should work on pre-mysql 5 too since it uses the "old" SHOW TABLE command instead of SELECT from infotable.
+	 */
 	public Iterator getSuggestedPrimaryKeyStrategyName(String catalog, String schema, String table) {
+		String sql = null;
 			try {			
 				catalog = caseForSearch( catalog );
 				schema = caseForSearch( schema );
@@ -17,27 +22,36 @@
 				
 				log.debug("getTables(" + catalog + "." + schema + "." + table + ")");
 				
-				String sql = "show table " + (schema==null?"":" " + schema + " ") + (table==null?"":" '" + table + "' ");
+				sql = "show table status " + (schema==null?"":" from " + schema + " ") + (table==null?"":" like '" + table + "' ");
 				PreparedStatement statement = getConnection().prepareStatement( sql );
 				
+				final String sc = schema;
 				return new ResultSetIterator(statement.executeQuery(), getSQLExceptionConverter()) {
 					
 					Map element = new HashMap();
 					protected Object convertRow(ResultSet tableRs) throws SQLException {
 						element.clear();
-						putTablePart( element, tableRs );
-						element.put("HIBERNATE_STRATEGY", tableRs.getString("AUTO_INCREMENT"));						
+						element.put("TABLE_NAME", tableRs.getString("NAME"));
+						element.put("TABLE_SCHEM", sc);
+						element.put("TABLE_CAT", null);
+						
+						String string = tableRs.getString("AUTO_INCREMENT");
+						if(string==null) {
+							element.put("HIBERNATE_STRATEGY", null);
+						} else {
+							element.put("HIBERNATE_STRATEGY", "identity");
+						}
 						return element;					
 					}
 					protected Throwable handleSQLException(SQLException e) {
 						// schemaRs and catalogRs are only used for error reporting if
 						// we get an exception
 						throw getSQLExceptionConverter().convert( e,
-								"Could not get list of suggested identity strategies from database. Probably a JDBC driver problem. ", null );					
+								"Could not get list of suggested identity strategies from database. Probably a JDBC driver problem. ", null);					
 					}
 				};
 			} catch (SQLException e) {
-				throw getSQLExceptionConverter().convert(e, "Could not get list of tables from database. Probably a JDBC driver problem.", null);		         
+				throw getSQLExceptionConverter().convert(e, "Could not get list of suggested identity strategies from database. Probably a JDBC driver problem. ", sql);		         
 			} 		
 		}
 	}

Modified: branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/java/org/hibernate/tool/hbmlint/detector/SchemaByMetaDataDetector.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -11,6 +11,8 @@
 import org.hibernate.cfg.Configuration;
 import org.hibernate.cfg.JDBCReaderFactory;
 import org.hibernate.cfg.Settings;
+import org.hibernate.cfg.reveng.AbstractDatabaseCollector;
+import org.hibernate.cfg.reveng.DatabaseCollector;
 import org.hibernate.cfg.reveng.DefaultDatabaseCollector;
 import org.hibernate.cfg.reveng.DefaultReverseEngineeringStrategy;
 import org.hibernate.cfg.reveng.JDBCReader;
@@ -40,7 +42,7 @@
 
 	private TableSelectorStrategy tableSelector;
 
-	private DefaultDatabaseCollector dbc;
+	private DatabaseCollector dbc;
 
 	private Dialect dialect;
 

Modified: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/CachedMetaDataTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/CachedMetaDataTest.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/hbm2x/CachedMetaDataTest.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -118,7 +118,7 @@
 	public void testCachedDialect() {
 		Settings buildSettings = cfg.buildSettings();
 				
-		MetaDataDialect realMetaData = JDBCReaderFactory.newMetaDataDialect( cfg.getProperties() );
+		MetaDataDialect realMetaData = JDBCReaderFactory.newMetaDataDialect( buildSettings.getDialect(), cfg.getProperties() );
 		
 		MockedMetaDataDialect mock = new MockedMetaDataDialect(realMetaData);
 		CachedMetaDataDialect dialect = new CachedMetaDataDialect(mock);

Deleted: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MySQLAutoIncrementTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MySQLAutoIncrementTest.java	2007-04-22 02:20:57 UTC (rev 11421)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/MySQLAutoIncrementTest.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -1,75 +0,0 @@
-/*
- * Created on 2004-11-23
- *
- */
-package org.hibernate.tool.test.jdbc2cfg;
-
-import java.sql.SQLException;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.hibernate.cfg.JDBCMetaDataConfiguration;
-import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.dialect.MySQLDialect;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.tool.JDBCMetaDataBinderTestCase;
-
-/**
- * @author max
- *
- */
-public class MySQLAutoIncrementTest extends JDBCMetaDataBinderTestCase {
-
-	
-	/**
-	 * @return
-	 */
-	protected String[] getDropSQL() {
-		return new String[] {
-				"drop table `autoinc`",
-				"drop table `noautoinc`",                
-		};	
-	}
-
-	/**
-	 * @return
-	 */
-	protected String[] getCreateSQL() {
-		
-		return new String[] {
-				"CREATE TABLE `autoinc` (`id` int(11) NOT NULL auto_increment,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
-				"CREATE TABLE `noautoinc` (`id` int(11) NOT NULL,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
-		};
-	}
-	
-	public boolean appliesTo(Dialect dialect) {
-		return dialect instanceof MySQLDialect;
-	}
-	
-	protected void configure(JDBCMetaDataConfiguration configuration) {
-		configuration.setProperty( "hibernatetool.metadatadialect", MySQLMetaDataDialect.class.getName() );
-	}
-	
-	public void testAutoIncrement() throws SQLException {
-				PersistentClass classMapping = cfg.getClassMapping(toClassName("autoinc") );
-				assertNotNull(classMapping);
-			
-				assertEquals("identity", ((SimpleValue)classMapping.getIdentifierProperty().getValue()).getIdentifierGeneratorStrategy());
-				
-				classMapping = cfg.getClassMapping(toClassName("noautoinc") );
-				assertEquals("assigned", ((SimpleValue)classMapping.getIdentifierProperty().getValue()).getIdentifierGeneratorStrategy());
-				
-	}
-	
-	public void assertNoTables() throws SQLException {
-		// can't do that on mysql
-	}
-
-	public static Test suite() {
-		return new TestSuite(MySQLAutoIncrementTest.class);
-	}
-    
-}

Added: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/AbstractIdentityTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/AbstractIdentityTest.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/AbstractIdentityTest.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -0,0 +1,22 @@
+package org.hibernate.tool.test.jdbc2cfg.identity;
+
+import java.sql.SQLException;
+
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.tool.JDBCMetaDataBinderTestCase;
+
+public abstract class AbstractIdentityTest extends JDBCMetaDataBinderTestCase {
+
+	public void testAutoIncrement() throws SQLException {
+		PersistentClass classMapping = cfg.getClassMapping(toClassName("autoinc") );
+		assertNotNull(classMapping);
+	
+		assertEquals("identity", ((SimpleValue)classMapping.getIdentifierProperty().getValue()).getIdentifierGeneratorStrategy());
+		
+		classMapping = cfg.getClassMapping(toClassName("noautoinc") );
+		assertEquals("assigned", ((SimpleValue)classMapping.getIdentifierProperty().getValue()).getIdentifierGeneratorStrategy());
+		
+}
+
+}

Added: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/H2IdentityTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/H2IdentityTest.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/H2IdentityTest.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -0,0 +1,60 @@
+/*
+ * Created on 2004-11-23
+ *
+ */
+package org.hibernate.tool.test.jdbc2cfg.identity;
+
+import java.sql.SQLException;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.JDBCMetaDataConfiguration;
+import org.hibernate.cfg.reveng.dialect.H2MetaDataDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.H2Dialect;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+
+/**
+ * @author max
+ *
+ */
+public class H2IdentityTest extends AbstractIdentityTest {
+
+	
+	/**
+	 * @return
+	 */
+	protected String[] getDropSQL() {
+		return new String[] {
+				"drop table `autoinc`",
+				"drop table `noautoinc`",                
+		};	
+	}
+
+	/**
+	 * @return
+	 */
+	protected String[] getCreateSQL() {
+		
+		return new String[] {
+				"CREATE TABLE `autoinc` (`id` int(11) NOT NULL identity,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
+				"CREATE TABLE `noautoinc` (`id` int(11) NOT NULL,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
+		};
+	}
+	
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof H2Dialect;
+	}
+	
+	protected void configure(JDBCMetaDataConfiguration configuration) {
+		configuration.setProperty( "hibernatetool.metadatadialect", H2MetaDataDialect.class.getName() );
+	}
+	
+
+	public static Test suite() {
+		return new TestSuite(H2IdentityTest.class);
+	}
+    
+}

Added: branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/MySQLIdentityTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/MySQLIdentityTest.java	                        (rev 0)
+++ branches/Branch_3_2/HibernateExt/tools/src/test/org/hibernate/tool/test/jdbc2cfg/identity/MySQLIdentityTest.java	2007-04-23 12:58:03 UTC (rev 11422)
@@ -0,0 +1,61 @@
+package org.hibernate.tool.test.jdbc2cfg.identity;
+
+import java.sql.SQLException;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.hibernate.cfg.JDBCMetaDataConfiguration;
+import org.hibernate.cfg.reveng.dialect.MySQLMetaDataDialect;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.MySQLDialect;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.tool.JDBCMetaDataBinderTestCase;
+
+/**
+ * @author max
+ *
+ */
+public class MySQLIdentityTest extends AbstractIdentityTest {
+
+	
+	/**
+	 * @return
+	 */
+	protected String[] getDropSQL() {
+		return new String[] {
+				"drop table `autoinc`",
+				"drop table `noautoinc`",                
+		};	
+	}
+
+	/**
+	 * @return
+	 */
+	protected String[] getCreateSQL() {
+		
+		return new String[] {
+				"CREATE TABLE `autoinc` (`id` int(11) NOT NULL auto_increment,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
+				"CREATE TABLE `noautoinc` (`id` int(11) NOT NULL,  `data` varchar(100) default NULL,  PRIMARY KEY  (`id`))",
+		};
+	}
+	
+	public boolean appliesTo(Dialect dialect) {
+		return dialect instanceof MySQLDialect;
+	}
+	
+	protected void configure(JDBCMetaDataConfiguration configuration) {
+		configuration.setProperty( "hibernatetool.metadatadialect", MySQLMetaDataDialect.class.getName() );
+	}
+	
+	
+	public void assertNoTables() throws SQLException {
+		// can't do that on mysql
+	}
+
+	public static Test suite() {
+		return new TestSuite(MySQLIdentityTest.class);
+	}
+    
+}




More information about the hibernate-commits mailing list