openjpa-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "William Cai" <w...@xwarelabs.com>
Subject SchemaCase setting in org.apache.openjpa.jdbc.sql.SQLServerDictionary
Date Tue, 30 Jan 2007 06:49:52 GMT
Hi folks,
I met a problem when running OpenJPA on a case-sensitive MS SQL Server
database. Schematool reported below error.

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException:
The database name component of the
 object qualifier must be the name of the current database.Listening for
transport dt_socket at address: 8111

        at
com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown
Source)
        at
com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Unknown
Source)
        at
com.microsoft.sqlserver.jdbc.SQLServerStatement$StatementExecutionRequest.executeStatement
(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown
Source)
        at
com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getResultSet(Unknown
Source)
        at com.microsoft.sqlserver.jdbc.SQLServerDatabaseMetaData.getTables(Unknown
Source)
        at org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData.getTables(
DelegatingDatabaseMetaData.java:32
3)
        at
org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingDatabaseMetaData.ge
tTables(LoggingConnectionDecorator.java:658)
        at org.apache.openjpa.lib.jdbc.DelegatingDatabaseMetaData.getTables(
DelegatingDatabaseMetaData.java:32
3)
        at org.apache.openjpa.jdbc.sql.DBDictionary.getTables(
DBDictionary.java:3119)
        at org.apache.openjpa.jdbc.schema.SchemaGenerator.generateTables(
SchemaGenerator.java:465)
        at org.apache.openjpa.jdbc.schema.SchemaGenerator.generateSchema(
SchemaGenerator.java:329)
        at org.apache.openjpa.jdbc.schema.SchemaGenerator.generateSchemas(
SchemaGenerator.java:260)
        at org.apache.openjpa.jdbc.schema.SchemaGenerator.generateSchemas(
SchemaGenerator.java:240)
        at org.apache.openjpa.jdbc.schema.SchemaTool.run(SchemaTool.java
:1360)
        at org.apache.openjpa.jdbc.schema.SchemaTool.run(SchemaTool.java
:1333)
        at org.apache.openjpa.jdbc.schema.SchemaTool.main(SchemaTool.java
:1283)

After some invesitigation, I found OpenJPA converted the lower case database
name to upper case in
org.apache.openjpa.jdbc.sql.DBDictionary.convertSchemaCase(String). (See
below code)  In this function we always convert objectName to upper case
unless schemaCase is set to "lower" or "preserve". schemaCase is initilized
with the value "upper", and changed in EmpressDictionary, MySQLDictionary,
PostgresDictionary, and SybaseDictionary. The problem is we keep the value
in SQLServerDictionary.

    protected String convertSchemaCase(String objectName) {
        if (objectName == null)
            return null;

        if (SCHEMA_CASE_LOWER.equals(schemaCase))
            return objectName.toLowerCase();
        if (SCHEMA_CASE_PRESERVE.equals(schemaCase))
            return objectName;
        return objectName.toUpperCase();
    }

One possible solution of my problem is developing a new SQLServerDictionary
in which schemaCase is set to "preserve". It should work. However, I still
have a couple of questions to the list:

1. Do we need set schemaCase to "preserve" in SQLServerDictionary as we did
in SybaseDictionary?
2. Are there any other solutions? e.g. set the value in some configuration
file, etc.

Thanks,
William

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message