Hi
I'm using the hibernate.hbm2ddl.auto=validate in my persistence.xml with two tables that have the same name from two distinct schema using oracle synonyms to choose the schema but the validator ignor the synonyms and always find same table to validate. Because he use the connection.getMetaData() to get the tables informations and return the firth table name matches. The problem is validation failed because the tables are different but the code run because the queries use the synonyms.
It is possible to see in the method getTableMetadata(String name, String schema, String catalog, boolean isQuoted) from org.hibernate.tool.hbm2ddl.DatabaseMetadata.java
the parameters are Table_TEST, null, null true
the tables are: create table schema1.Table_TEST { teste1 number null, }
create table schema2.Table_TEST { teste2 number null, }
synonyms is schema2 but always the metod return schema1.Table_TEST
public TableMetadata getTableMetadata(String name, String schema, String catalog, boolean isQuoted) throws HibernateException { 75 76 Object identifier = identifier(catalog, schema, name); 77 TableMetadata table = (TableMetadata) tables.get(identifier); 78 if (table!=null) { 79 return table; 80 } 81 else { 82 83 try { 84 ResultSet rs = null; 85 try { 86 if ( (isQuoted && meta.storesMixedCaseQuotedIdentifiers())) { 87 rs = meta.getTables(catalog, schema, name, TYPES); 88 } else if ( (isQuoted && meta.storesUpperCaseQuotedIdentifiers()) 89 || (!isQuoted && meta.storesUpperCaseIdentifiers() )) { 90 rs = meta.getTables( 91 StringHelper.toUpperCase(catalog), 92 StringHelper.toUpperCase(schema), 93 StringHelper.toUpperCase(name), 94 TYPES 95 ); 96 } 97 else if ( (isQuoted && meta.storesLowerCaseQuotedIdentifiers()) 98 || (!isQuoted && meta.storesLowerCaseIdentifiers() )) { 99 rs = meta.getTables( 100 StringHelper.toLowerCase(catalog), 101 StringHelper.toLowerCase(schema), 102 StringHelper.toLowerCase(name), 103 TYPES 104 ); 105 } 106 else { 107 rs = meta.getTables(catalog, schema, name, TYPES); 108 } 109 110 while ( rs.next() ) { 111 String tableName = rs.getString("TABLE_NAME"); 112 if ( name.equalsIgnoreCase(tableName) ) { 113 table = new TableMetadata(rs, meta, extras); 114 tables.put(identifier, table); 115 return table; //First match without consider synonyms 116 } 117 } 118 119 log.info("table not found: " + name); 120 return null; 121 122 } 123 finally { 124 if (rs!=null) rs.close(); 125 } 126 } 127 catch (SQLException sqle) { 128 throw JDBCExceptionHelper.convert( 129 sqlExceptionConverter, 130 sqle, 131 "could not get table metadata: " + name 132 ); 133 } 134 } 135 136 }
It is a hibernate error?
|