2013-07-28 77 views
3

我在使用JPA將unicode字符存儲到Oracle 11g時遇到問題。 當我使用這個存儲一個unicode字符串到數據庫(someTranslation是一個包含unicode字符串的對象)。使用JPA在Oracle 11g中存儲unicode字符

someTranslation.setMessage("文字"); //literally means characters 
em.persist(someTranslation); 

該字符串然後顯示爲倒置'?' (「¿」)

當我使用SQLDeveloper在數據庫中手動修復損壞的字符串時,字符將按照它的意圖正確顯示。

我已經搜索了一下,當using MySQL,只需要一個小的修改來糾正這一點。我覺得我遇到了與該帖子相同的問題,除了我正在使用oracle 11g。有誰知道在Oracle 11g中的這個問題的解決方案嗎?提前致謝。

這裏是我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
<persistence-unit name="cbpejb" transaction-type="JTA"> 
    <class>entity.Translation</class> 
    <properties> 
     <property name="openjpa.ConnectionDriverName" value="oracle.jdbc.OracleDriver" /> 
     <property name="openjpa.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:orcldb" /> 
     <property name="openjpa.ConnectionUserName" value="dev" /> 
     <property name="openjpa.ConnectionPassword" value="dev00" /> 
     <property name="openjpa.jdbc.Schema" value="DEV" /> 
    </properties> 
</persistence-unit> 

+0

您的回覆@gerrytan謝謝,我已經選擇了正確的字符使用columnDefinition =「NVARCHAR2(2000)」鍵入NVARCHAR2,如果手動將其輸入到數據庫中,則顯示正確。問題似乎是從java存儲到oracle時數據已損壞。 – kftse

+0

我注意到有一個警告,建議我使用OraclePreparedStatement.setFormOfUse(),但我不知道如何在JPA中使用它。 – kftse

+0

你知道如何使用JPA的OraclePreparedStatement.setFormOfUse()嗎? –

回答

1

有兩種可能出現的問題:

  1. 您選擇了錯誤的數據庫列類型(如:數據庫列/配置沒支持多字節字符)。在Oracle中,您需要use NCHAR/NVARCHAR
  2. 您選擇了正確的列類型,但是您的未正確顯示它

由於Java本身的,String類支持Unicode,並使用UTF-16編碼,但你的JDBC驅動程序應該處理EN /解碼