Skip to content

Commit b455b2d

Browse files
committed
HHH-8183 Added setting to enable synonyms
Conflicts: hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java
1 parent e2afe7f commit b455b2d

File tree

4 files changed

+49
-12
lines changed

4 files changed

+49
-12
lines changed

hibernate-core/src/main/java/org/hibernate/cfg/AvailableSettings.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package org.hibernate.cfg;
2525

26+
2627
/**
2728
* @author Steve Ebersole
2829
*/
@@ -641,4 +642,12 @@ public interface AvailableSettings {
641642
* Default is <code>true</code> (enabled).
642643
*/
643644
public static final String JTA_TRACK_BY_THREAD = "hibernate.jta.track_by_thread";
645+
646+
/**
647+
* If enabled, allows {@link org.hibernate.tool.hbm2ddl.DatabaseMetadata} to
648+
* support synonyms during schema update and validations. Due to the
649+
* possibility that this would return duplicate tables (especially in
650+
* Oracle), this is disabled by default.
651+
*/
652+
public static final String ENABLE_SYNONYMS = "hibernate.synonyms";
644653
}

hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/DatabaseMetadata.java

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,20 +34,25 @@
3434
import java.util.Map;
3535
import java.util.Set;
3636

37-
import org.jboss.logging.Logger;
38-
3937
import org.hibernate.HibernateException;
38+
import org.hibernate.cfg.AvailableSettings;
39+
import org.hibernate.cfg.Configuration;
4040
import org.hibernate.dialect.Dialect;
4141
import org.hibernate.engine.jdbc.spi.SqlExceptionHelper;
4242
import org.hibernate.exception.spi.SQLExceptionConverter;
4343
import org.hibernate.internal.CoreMessageLogger;
4444
import org.hibernate.internal.util.StringHelper;
45+
import org.hibernate.internal.util.config.ConfigurationHelper;
4546
import org.hibernate.mapping.Table;
47+
import org.jboss.logging.Logger;
4648

4749
/**
4850
* JDBC database metadata
4951
* @author Christoph Sturm, Teodor Danciu
5052
*/
53+
/**
54+
* @author Brett Meyer
55+
*/
5156
public class DatabaseMetadata {
5257

5358
private static final CoreMessageLogger LOG = Logger.getMessageLogger(CoreMessageLogger.class, DatabaseMetaData.class.getName());
@@ -59,19 +64,42 @@ public class DatabaseMetadata {
5964
private DatabaseMetaData meta;
6065
private SQLExceptionConverter sqlExceptionConverter;
6166

67+
private final String[] types;
68+
/**
69+
* @deprecated Use {@link #DatabaseMetadata(Connection, Dialect, Configuration)} instead
70+
*/
71+
@Deprecated
6272
public DatabaseMetadata(Connection connection, Dialect dialect) throws SQLException {
63-
this(connection, dialect, true);
73+
this(connection, dialect, null, true);
6474
}
6575

76+
/**
77+
* @deprecated Use {@link #DatabaseMetadata(Connection, Dialect, Configuration, boolean)} instead
78+
*/
79+
@Deprecated
6680
public DatabaseMetadata(Connection connection, Dialect dialect, boolean extras) throws SQLException {
81+
this(connection, dialect, null, extras);
82+
}
83+
84+
public DatabaseMetadata(Connection connection, Dialect dialect, Configuration config) throws SQLException {
85+
this(connection, dialect, config, true);
86+
}
87+
88+
public DatabaseMetadata(Connection connection, Dialect dialect, Configuration config, boolean extras)
89+
throws SQLException {
6790
sqlExceptionConverter = dialect.buildSQLExceptionConverter();
6891
meta = connection.getMetaData();
6992
this.extras = extras;
70-
initSequences(connection, dialect);
93+
initSequences( connection, dialect );
94+
if ( config != null
95+
&& ConfigurationHelper.getBoolean( AvailableSettings.ENABLE_SYNONYMS, config.getProperties(), false ) ) {
96+
types = new String[] { "TABLE", "VIEW", "SYNONYM" };
97+
}
98+
else {
99+
types = new String[] { "TABLE", "VIEW" };
100+
}
71101
}
72102

73-
private static final String[] TYPES = {"TABLE", "VIEW", "SYNONYM"};
74-
75103
public TableMetadata getTableMetadata(String name, String schema, String catalog, boolean isQuoted) throws HibernateException {
76104

77105
Object identifier = identifier(catalog, schema, name);
@@ -85,14 +113,14 @@ public TableMetadata getTableMetadata(String name, String schema, String catalog
85113
ResultSet rs = null;
86114
try {
87115
if ( (isQuoted && meta.storesMixedCaseQuotedIdentifiers())) {
88-
rs = meta.getTables(catalog, schema, name, TYPES);
116+
rs = meta.getTables(catalog, schema, name, types);
89117
} else if ( (isQuoted && meta.storesUpperCaseQuotedIdentifiers())
90118
|| (!isQuoted && meta.storesUpperCaseIdentifiers() )) {
91119
rs = meta.getTables(
92120
StringHelper.toUpperCase(catalog),
93121
StringHelper.toUpperCase(schema),
94122
StringHelper.toUpperCase(name),
95-
TYPES
123+
types
96124
);
97125
}
98126
else if ( (isQuoted && meta.storesLowerCaseQuotedIdentifiers())
@@ -101,11 +129,11 @@ else if ( (isQuoted && meta.storesLowerCaseQuotedIdentifiers())
101129
StringHelper.toLowerCase( catalog ),
102130
StringHelper.toLowerCase(schema),
103131
StringHelper.toLowerCase(name),
104-
TYPES
132+
types
105133
);
106134
}
107135
else {
108-
rs = meta.getTables(catalog, schema, name, TYPES);
136+
rs = meta.getTables(catalog, schema, name, types);
109137
}
110138

111139
while ( rs.next() ) {

hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/SchemaUpdate.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ public void execute(Target target) {
193193
LOG.fetchingDatabaseMetadata();
194194
connectionHelper.prepare( true );
195195
connection = connectionHelper.getConnection();
196-
meta = new DatabaseMetadata( connection, dialect );
196+
meta = new DatabaseMetadata( connection, dialect, configuration );
197197
stmt = connection.createStatement();
198198
}
199199
catch ( SQLException sqle ) {

hibernate-core/src/main/java/org/hibernate/tool/hbm2ddl/SchemaValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public void validate() {
145145
LOG.fetchingDatabaseMetadata();
146146
connectionHelper.prepare( false );
147147
connection = connectionHelper.getConnection();
148-
meta = new DatabaseMetadata( connection, dialect, false );
148+
meta = new DatabaseMetadata( connection, dialect, configuration, false );
149149
}
150150
catch ( SQLException sqle ) {
151151
LOG.unableToGetDatabaseMetadata(sqle);

0 commit comments

Comments
 (0)