I just confirmed the problem also had existing using MySQL.
I recreated the table and records for DISCOUNT_CODE in a MySQL database and had the same exception and the property setting (both versions) got rid of the error.

Still, this should default to "false" imho.


On 10/24/2013 04:17 PM, Kay Wrobel wrote:
Ja, I actually used:
<property name="openjpa.jdbc.DBDictionary" value="storeCharsAsNumbers=false"/>
and that works as well.

On 10/24/2013 03:54 PM, Rick Curtis wrote:
Sorry, I wrote that quickly.... yes it was missing a ')'. If that doesn't
work, please collect trace.

<property name="openjpa.jdbc.DBDictionary" value="derby(
storeCharsAsNumbers=false)"/>


On Thu, Oct 24, 2013 at 3:50 PM, Kay Wrobel <[email protected]> wrote:

Are you sure value is derby(storeCharsAsNumbers=**false??? That looks
wrong somehow.

The "(" in there.


On 10/24/2013 03:42 PM, Rick Curtis wrote:

As I suggested on IRC earlier this week, try setting the following
property
to see if it makes things work...
<property name="openjpa.jdbc.**DBDictionary"
value="derby(**storeCharsAsNumbers=false"/>

If it doesn't work, enable trace and let us take a peek.
<property name="openjpa.Log" value="DefaultLevel=trace"/>

Thanks,
Rick


On Thu, Oct 24, 2013 at 3:26 PM, Kay Wrobel <[email protected]> wrote:

I have to make a correction to the last statement in my original post:
The
content values of DISCOUNT_CODE field are /*not*/ of numeric value, but
actual characters, such as 'H' or 'M'. Sorry for causing confusion.


On 10/24/2013 03:17 PM, Mark Struberg wrote:

  My finding so far is that the DerbyDictionary doesn't overwrite
storeCharsAsNumbers, so it's still defaulted to true.
This code is exactly which trashes in the sample


Caused by: java.sql.SQLDataException: Invalid character string format
for
type int.
at org.apache.derby.client.am.****SQLExceptionFactory40.****
getSQLException(Unknown
Source)
           at org.apache.derby.client.am.****
SqlException.getSQLException(****Unknown
Source)
at org.apache.derby.client.am.****ResultSet.getInt(Unknown
Source)
at org.apache.commons.dbcp.****DelegatingResultSet.getInt(**
DelegatingResultSet.java:225)
at org.apache.commons.dbcp.****DelegatingResultSet.getInt(**
DelegatingResultSet.java:225)
           at org.apache.openjpa.lib.jdbc.****
DelegatingResultSet.getInt(**
DelegatingResultSet.java:137)
           at org.apache.openjpa.jdbc.sql.****DBDictionary.getInt(**
DBDictionary.java:841)
at org.apache.openjpa.jdbc.sql.****DBDictionary.getChar(**
DBDictionary.java:740)
           at org.apache.openjpa.jdbc.sql.****ResultSetResult.**
getCharInternal(****ResultSetResult.java:300)
           at org.apache.openjpa.jdbc.sql.****ResultSetResult.**
getObjectInternal(****ResultSetResult.java:377)


The stacktrace is with todays 2.3.x branch snapshot.

DBDictionary#getChar():
       public char getChar(ResultSet rs, int column)
           throws SQLException {
           if (storeCharsAsNumbers)
               return (char) getInt(rs, column); <-- line 740 boom
...

The question for me is how Derby usually stores char fields internally. Is our DerbyDictionary just wrong and should it set storeCharsAsNumbers
to false?

There is of course the option to use @ColumnDefinition in the entity.
This should bypass this flag (I hope, didn't test it yet).

LieGrue,
strub




----- Original Message -----

  From: Kay Wrobel <[email protected]>
To: [email protected]
Cc:
Sent: Thursday, 24 October 2013, 22:08
Subject: PersistenceException: Invalid character string format for type
int

Dear OpenJPA Dev Team,

I am getting this exception
<https://raw.github.com/****kwrobel/OpenJPA-****
IntExceptionTest/master/**<https://raw.github.com/**kwrobel/OpenJPA-**IntExceptionTest/master/**>
OpenJPA-IntExceptionTest/****DiscountCode-Exception.txt<htt**
ps://raw.github.com/kwrobel/**OpenJPA-IntExceptionTest/**
master/OpenJPA-**IntExceptionTest/DiscountCode-**Exception.txt<https://raw.github.com/kwrobel/OpenJPA-IntExceptionTest/master/OpenJPA-IntExceptionTest/DiscountCode-Exception.txt> while reading a simple entity DiscountCode from a Derby database called SAMPLE (ships with Glassfish/NetBeans) called DISCOUNT_CODE that has
only two fields:

1. DISCOUNT_CODE  CHAR(1) NOT NULL PRIMARY KEY
2. RATE DECIMAL(4,2) NULL

DISCOUNT_CODE maps to type "Character" and RATE maps to
"BigDecimal". I
set up a Github <https://github.com/kwrobel/****
OpenJPA-IntExceptionTest<https://github.com/kwrobel/**OpenJPA-IntExceptionTest> <https**://github.com/kwrobel/OpenJPA-**IntExceptionTest<https://github.com/kwrobel/OpenJPA-IntExceptionTest> with a small test project. It's really small and concise. All you need to run this is a running Derby Network server with the SAMPLE database (included on the github), the latest OpenJPA library (I tested so far: 2.2.0 shipping with TomEE 1.5.2, 2.2.2 from the main project page, and 2.3.0-SNAPSHOT), the derby client driver (derby.jar, derbyclient.jar, derbynet.jar from the main Apache Derby distribution) and that's it.

The curious part is that the field DiscountCode, though a char field, contains numeric, integer values. Mark Struberg seems to have a hunch
already of what is going on and is able to add some more insight.

Any input on this is greatly appreciated.

Regards,

Kay Wrobel






Reply via email to