[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