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
----------------------------


Reply via email to