Hi,
I have a small application which uses JPA and MS SQL Server. It works on that
platform but I am having a problem when using MySQL for the database. I get an
error trying to resolve metadata. I stepped thru the JPA code and found out
that the problem occurs because the schemaName is not being returned from the
SHOW FULL COLUMNS which is called to get all the columns for the table. When
the new Column object is created - it has no shemaName. JPA wants to use this
schemaName for hashmaps for schemaGroups, etc. Later, when it tries to resolve
each table/column with the correct schema name (which I guess it is getting
from orm.xml) it cant find it. I get an error saying the table does not exist
(even though it was clearly accessing the table and its columns from the
database).
I was able to work around this by sub-classing MySQLDictionary and overriding
the newColumn(ResultSet meta) method. I invoke super.newColumn(meta) and if
the column returned doesnt have a schemaName (which it never does), then I
hard-code my value. Obviously this shouldnt be necessary and I must not have
something configured correctly but it seems I should have a better error
message. Is this a JPA bug?
I am using the following properties :
<property name="openjpa.Optimistic" value="true" />
<property name="openjpa.NontransactionalRead" value="true" />
<property name="openjpa.NontransactionalWrite" value="false" />
<!--property name="openjpa.jdbc.DBDictionary"
value="org.apache.openjpa.jdbc.sql.MySQLDictionary" /-->
<property name="openjpa.jdbc.DBDictionary"
value="com.siemens.soarian.eld.entity.KensMySQLDictionary" />
<property name="openjpa.ConnectionURL"
value="jdbc:mysql://localhost:3306/eld" />
<property name="openjpa.ConnectionUserName" value="Smsapps" />
<property name="openjpa.ConnectionPassword" value="Smspass1!" />
<property name="openjpa.ConnectionDriverName"
value="com.mysql.jdbc.Driver" />
<property name="openjpa.ConnectionProperties"
value="sendStringParametersAsUnicode=false,InsensitiveResultSetBufferSize=-1,QueryTimeout=10"
/>
<property name="openjpa.ConnectionFactoryProperties"
value="PrettyPrint=true, PrettyPrintLineLength=72, QueryTimeout=10,
TrackParameters=true, WarningAction=none, MaxCachedStatements=0" />
<property name="openjpa.ConnectionFactoryMode" value="local" />
<property name="openjpa.ConnectionRetainMode" value="transaction" />
<property name="openjpa.DataCache" value="false" />
<property name="openjpa.QueryCache" value="false" />
<property name="openjpa.RemoteCommitProvider" value="sjvm" />
<property name="openjpa.FlushBeforeQueries" value="true" />
<property name="openjpa.IgnoreChanges" value="true" />
<property name="openjpa.RetainState" value="true" />
<property name="openjpa.RestoreState" value="true" />
<property name="openjpa.jdbc.SubclassFetchMode" value="join" />
<!-- Need to check this next one - OpenJPA does not define any values
yet -->
<property name="openjpa.Compatibility"
value="ValidateFalseReturnsHollow=false,ValidateTrueChecksStore=true" />
<property name="openjpa.jdbc.SchemaFactory"
value="native(ForeignKeys=true)" />
<property name="openjpa.jdbc.Schema" value="dbo"/>
<property name="openjpa.TransactionMode" value="managed" />
<property name="openjpa.ManagedRuntime"
value="invocation(TransactionManagerMethod=com.siemens.soarian.se.soa.server.EMFTestHelper.getTransactionManager)"
/>
<property name="openjpa.Log" value="DefaultLevel=TRACE, SQL=TRACE,
Runtime=TRACE, Query=TRACE, MetaData=TRACE, Tool=INFO" />
Ken Swanson
[EMAIL PROTECTED]
[EMAIL PROTECTED]