Guillaume -
I don't think OJB has any connection-specific configuration, but you can
try this code on your insert:
ClassDescriptor classDescriptor = broker.getClassDescriptor(YourClass.class);
PreparedStatement statementInsert =
broker.serviceStatementManager().getInsertStatement(classDescriptor);
((OraclePreparedStatement)statementInsert).setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR);
broker.serviceStatementManager().bindInsert(statementInsert , classDescriptor,
yourObject);
broker.store(yourObject);
Obviously, you can change it slightly for an update.
--Bobby
Guillaume Laforge wrote:
I forgot to mention that I'm using Oracle9i's thin driver and its ojdbc14.jar.
With a version 9.2.0.4 of Oracle9i.
On 28/07/05, Guillaume Laforge <[EMAIL PROTECTED]> wrote:
Hello,
On my current project, I'm using Oracle9i and OJB. The version of OJB
is rather old: that's 1.0.0, but I may and will certainly upgrade to
1.0.3 if that's needed.
I'm storing sentences in 40 different languages (English, French,
Japanese, Chinese, etc...).
All the columns of my tables which are supposed to be holding some
i18n content are of type NVARCHAR2 or NCHAR -- i.e. I'm using
Oracle9i's specific types for storing Unicode characters.
My problem is that when I try to store and then retrieve labels with
non-latin characters, I don't get the same string. In fact, the label
is badly stored in the database, and badly encoded.
Hence the question: How can I manage to configure OJB, or perhaps my
datasource, or my mapping, to make OJB store java Unicode strings
correctly?
Brian told me there may be some specific means for altering all
statements for a give data type. Is there some documentation somewhere
I could read? Oracle allows to use a specific pstmt.setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR) which is an extension to JDBC
unfortunately.
To give some more background, here are some more specific details on
my Oracle9i configuration:
SQL> select * from nls_database_parameters;
PARAMETER VALUE
------------------------------ --------------------------
NLS_LANGUAGE FRENCH
NLS_TERRITORY FRANCE
NLS_CURRENCY ? (ca doit être le caractère euro, mais le DOS ne le
supporte pas à l'affichage)
NLS_ISO_CURRENCY FRANCE
NLS_NUMERIC_CHARACTERS ,.
NLS_CHARACTERSET WE8ISO8859P15
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/YYYY
NLS_DATE_LANGUAGE FRENCH
NLS_SORT FRENCH
NLS_TIME_FORMAT HH24:MI:SSXFF
PARAMETER VALUE
------------------------------ --------------------------
NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
NLS_DUAL_CURRENCY ? (encore le caractère euro)
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 9.2.0.4.0
As you can see, my default encoding is the same as the system it's
installed on, and it's by default WE8ISO8859P15. And with that default
charset, Oracle treats all String inserts as if the String was a local
String using this encoding, though the NCHAR type has a 16-bit Unicode
charset.
Oracle9i provides a way to specifically tell the JDBC driver to encode
a String as a Unicode string for the Unicode data types (NCLOB, NCHAR,
NVARCHAR2), and you can do something like:
PreparedStatement statementInsert = cnx.prepareStatement(query);
((OraclePreparedStatement)statementInsert).setFormOfUse(1,
OraclePreparedStatement.FORM_NCHAR);
This solution works, and I can store and retrieve Unicode content.
But obviously, that's not very clean... especially because it uses a
specific Oracle method on its specific implementation of
PreparedStatement.
But well, if that works in JDBC, perhaps there could be a way to do
that with OJB? Some configuration / customisation?
Has anyone encountered that problem and workarounded that it?
Thanks in advance for all the tips or potential solutions.
--
----------------------------
Bobby Lawrence
MIS Application Developer
Jefferson Lab (www.jlab.org)
Email: [EMAIL PROTECTED]
Office: (757) 269-5818
Pager: (757) 584-5818
----------------------------