2009-03-11 15 views
4

SQL Server 2005を使用してSpringとHibernateを統合し、Unicodeをサポートする方法を教えてください。 私はいろいろな方法で試しましたが、うまく動作しませんでした。Spring + Hibernate + SqlサーバーとUnicodeサポートの統合

テーブルの列はnvarcharです。スプリングの文字セットはUTF-8です。 Unicodeテキスト(SQL Server管理ツールを使用して自分自身を追加したもの)を読み込むことはできますが、書き込みは機能しません。DBにぎこちなくなります。

JDBC URLは

<property name="hibernate.connection.useUnicode">true</property> 
<property name="hibernate.connection.charSet">UTF8</property> 

は、私はまた、すべてのページのエンコーディングを変更するフィルタを持って

response.setContentType("text/html; charset=UTF-8"); 
request.setCharacterEncoding("UTF8"); 

chain.doFilter(request, response); 

//do it again, since JSPs will set it to the default 
response.setContentType("text/html; charset=UTF-8"); 
request.setCharacterEncoding("UTF8"); 

があるHibernate設定ファイルでこれらのプロパティを持つ

jdbc:sqlserver://localhost:1433;useUnicode=true;characterEncoding=UTF-8;databaseName=test; 

ですそうすることに成功し、助けることができる良い魂?

多くの感謝!

+0

を私はUTF-8を使用することができない場合は、UCS-2(またはUTF-16でこれを行う方法を知っておくとよいでしょう。.. )。 UCS-2に文字セットに変更する以外に特別なことはありますか? – TheGuyWhoCodes

+0

これをチェックしますが、SQL ServerがUTF8をサポートしているとは思いません。あなたが得ることができる最も近い近似は、UCS-2エンコーディングです。 [このMSDNの記事](http://support.microsoft.com/kb/232580)を参照してください。 – duffymo

+0

フィルタを追加:http://stackoverflow.com/questions/11758094/hibernate-encodes-wrong-while-persisting-objects-utf-8 – alditis

答えて

2

レスポンスを変更し、フィルタ内のエンコーディングをUTF-8に変更する必要があると思われます。

1

は、ここに提案してみてください:http://blog.tremend.ro/2007/05/23/hibernate-utf-8-and-sql-server-2005/

/** 
* Unicode support in SQL Server 
*/ 
public class UnicodeSQLServerDialect extends SQLServerDialect { 

    public UnicodeSQLServerDialect() { 
     super(); 

     // Use Unicode Characters 
     registerColumnType(Types.VARCHAR, 255, "nvarchar($l)"); 
     registerColumnType(Types.CHAR, "nchar(1)"); 
     registerColumnType(Types.CLOB, "nvarchar(max)"); 

     // Microsoft SQL Server 2000 supports bigint and bit 
     registerColumnType(Types.BIGINT, "bigint"); 
     registerColumnType(Types.BIT, "bit"); 
    } 
} 
0
 
public class SQLServerUnicodeDialect extends org.hibernate.dialect.SQLServerDialect { 
    public SQLServerUnicodeDialect() { 
     super(); 
     registerColumnType(Types.CHAR, "nchar(1)"); 
     registerColumnType(Types.LONGVARCHAR, "nvarchar(max)"); 
     registerColumnType(Types.VARCHAR, 4000, "nvarchar($l)"); 
     registerColumnType(Types.VARCHAR, "nvarchar(max)"); 
     registerColumnType(Types.CLOB, "nvarchar(max)"); 

     registerColumnType(Types.NCHAR, "nchar(1)"); 
     registerColumnType(Types.LONGNVARCHAR, "nvarchar(max)"); 
     registerColumnType(Types.NVARCHAR, 4000, "nvarchar($l)"); 
     registerColumnType(Types.NVARCHAR, "nvarchar(max)"); 
     registerColumnType(Types.NCLOB, "nvarchar(max)"); 

     registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName()); 
     registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName()); 
     registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName()); 
     registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName()); 
    } 
}