|
View:
New views
8 Messages
—
Rating Filter:
Alert me
|
|
|
JPA(Toplink)でMS SQLのマッピングを変更するには?いつもお世話になっている苑田です。
NB6.0.1とToplink Essential、MS SQL 2005という組み合わせでの質問です。 (J2SDK5-12を使っています) ToplinkはOracleのサイトからダウンロードした最新のもの glassfish-persistence-installer-v2-b41.jar またMS SQL 2005のJDBCは sqljdbc_1.2.2828.100_enu.exe を使っています。 【問題】 ToplinkによるEntity Beanを、例えば以下のようにします。 public class person implements Serializable{ @Entity : private String name; private int age; : @ public void setName(String name){ this.name = name; } public String getName(){ return name; } } これでMS SQL 2005側にPERSONというテーブルが出来て、 フィールドに、NAMEとAGEができるわけですが、問題は、MS SQL 2005側の NAMEの型が、 varchar(255); なために、NAMEで日本語の名前を扱おうとしても、データベースマネージャで フィールドを覗いてみると、"?????"となっています。 問題の所在は、MS SQL 2005で日本語文字列を扱う場合は、 上記のvarcharを使う場合は varchar -> nvarchar にしないといけないし、あるいはvarcharでなければ、ntext, などの型を 使わなければいけないというところにあるようです。 少なくとも、ToplinkによってMS SQL側にできるフィールドがvarcharの ままでは、そこに日本語文字列を入れることが出来ません。 【質問】 なるべく現在のJPAのスタイル(コーディングの手間というか)を維持しつつ 最も少ない手間でMS SQL 2005側に日本語文字列を入れられるように するにはどうしたらよいでしょう? いろいろと調べたところ、以下のような方法がありそうです。 (1)新たにマッピングを自分で作る。 Toplinkでサポートされていないデータベースを使う場合は、 oracle.toplink.helperとかといったクラスを拡張して、マッピングの 指定を明示的に行うことが出来るようです。 ただ、どれだけ手間が発生するか(あるいはoverrideすべき処理が どれくらいあるのか)が見えないので、手を出していません。 (2)マッピングのxmlを変更する。 config/database-schema/<db>.xml というファイルがあるので、そこのMS SQLに該当するxmlファイルをいじって マッピングを変更する。 これはどうもOracle JDeveloperとかを使っている場合の、アプリケーションサーバ 側の設定のようなので、今回のようにJPAをスタンドアローンで使う場合は 使えないようです。 (3)その他 たとえばnameに値を入れる場合に、????にならない文字列に変換して 入れ、取り出すときに所望の文字コードに戻すよう、Entity Beanの getter/setterの中に処理を書く。 たとえば、アプリケーションとしてはShitf-JISを扱い、データベース内では eucにするなど。 これはやってみたのですが、うまくいきませんでした。(つまり????になる) だめもとで、N'山田太郎' なんて具合に、あのNをつけても見ましたが、 まぁこれはだめでした。(N'??????' なんて文字列が入ってしまう) 単純な話、ToplinkとMS SQL 2005という組み合わせのときに、日本語の 文字列を扱えるようにしたいだけなので、他に方法があればなんでもかまいません。 (そもそも、ToplinkはOracleのもの。MS製品と組み合わせるところに 無理があるのか。。。。) でも、結構ありがちなケースだと思いますし、文字列で日本語を、なんてのは あたりまえに出てくる話だと思うのですが。。。。 結構いろいろとネットを検索したのですが、いまのところ該当の情報には あたっていません。(Oracle Toplinkのフォーラムとか、MS SQLのフォーラム など。。。) どうかお知恵お貸しいただけると助かります。 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?原田です
MS SQLは使ってないので、単なる質問ですが、 persistence.xmlのtoplink.platform.class.nameを oracle.toplink.essentials.platform.database.SQLServerPlatform にしても、SQL Serverには日本語で格納されないということでしょうか? 以上 ----- Original Message ----- From: <sk8er.ys@...> To: <nbdiscuss_ja@...> Sent: Tuesday, March 25, 2008 11:47 AM Subject: [nbdiscuss_ja] JPA(Toplink)でMS SQLのマッピングを変更するには? > いつもお世話になっている苑田です。 > > NB6.0.1とToplink Essential、MS SQL 2005という組み合わせでの質問です。 > (J2SDK5-12を使っています) > > ToplinkはOracleのサイトからダウンロードした最新のもの > glassfish-persistence-installer-v2-b41.jar > > またMS SQL 2005のJDBCは > sqljdbc_1.2.2828.100_enu.exe > > を使っています。 > > 【問題】 > ToplinkによるEntity Beanを、例えば以下のようにします。 > > public class person implements Serializable{ > > @Entity > : > private String name; > private int age; > : > @ > public void setName(String name){ > this.name = name; > } > public String getName(){ > return name; > } > > } > > これでMS SQL 2005側にPERSONというテーブルが出来て、 > フィールドに、NAMEとAGEができるわけですが、問題は、MS SQL 2005側の > NAMEの型が、 > > varchar(255); > > なために、NAMEで日本語の名前を扱おうとしても、データベースマネージャで > フィールドを覗いてみると、"?????"となっています。 > > 問題の所在は、MS SQL 2005で日本語文字列を扱う場合は、 > 上記のvarcharを使う場合は > > varchar -> nvarchar > > にしないといけないし、あるいはvarcharでなければ、ntext, などの型を > 使わなければいけないというところにあるようです。 > > 少なくとも、ToplinkによってMS SQL側にできるフィールドがvarcharの > ままでは、そこに日本語文字列を入れることが出来ません。 > > 【質問】 > > なるべく現在のJPAのスタイル(コーディングの手間というか)を維持しつつ > 最も少ない手間でMS SQL 2005側に日本語文字列を入れられるように > するにはどうしたらよいでしょう? > > いろいろと調べたところ、以下のような方法がありそうです。 > > (1)新たにマッピングを自分で作る。 > > Toplinkでサポートされていないデータベースを使う場合は、 > oracle.toplink.helperとかといったクラスを拡張して、マッピングの > 指定を明示的に行うことが出来るようです。 > > ただ、どれだけ手間が発生するか(あるいはoverrideすべき処理が > どれくらいあるのか)が見えないので、手を出していません。 > > (2)マッピングのxmlを変更する。 > > config/database-schema/<db>.xml > > というファイルがあるので、そこのMS SQLに該当するxmlファイルをいじって > マッピングを変更する。 > > これはどうもOracle JDeveloperとかを使っている場合の、アプリケーションサーバ > > 側の設定のようなので、今回のようにJPAをスタンドアローンで使う場合は > 使えないようです。 > > (3)その他 > > たとえばnameに値を入れる場合に、????にならない文字列に変換して > 入れ、取り出すときに所望の文字コードに戻すよう、Entity Beanの > getter/setterの中に処理を書く。 > > たとえば、アプリケーションとしてはShitf-JISを扱い、データベース内では > eucにするなど。 > > これはやってみたのですが、うまくいきませんでした。(つまり????になる) > > だめもとで、N'山田太郎' なんて具合に、あのNをつけても見ましたが、 > まぁこれはだめでした。(N'??????' なんて文字列が入ってしまう) > > 単純な話、ToplinkとMS SQL 2005という組み合わせのときに、日本語の > 文字列を扱えるようにしたいだけなので、他に方法があればなんでもかまいません。 > > (そもそも、ToplinkはOracleのもの。MS製品と組み合わせるところに > 無理があるのか。。。。) > > でも、結構ありがちなケースだと思いますし、文字列で日本語を、なんてのは > あたりまえに出てくる話だと思うのですが。。。。 > > 結構いろいろとネットを検索したのですが、いまのところ該当の情報には > あたっていません。(Oracle Toplinkのフォーラムとか、MS SQLのフォーラム > など。。。) > > どうかお知恵お貸しいただけると助かります。 > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?原田様
苑田です。 現在のPersistence.xmlを見てみると、 <provider>oracle.toplink.essentials.PersistenceProvider</provider> となっています。 最初にNB6.0.1でこのプロジェクト用に永続化ユニットを作成した際、 これを選んだ記憶がありますが、原田様が指摘されているクラスが あったかどうか、よく覚えていません。 とりあえずお教えいただいたものに書き換えてためしてみましたが、 Exception in thread "AWT-EventQueue-0" javax.persistence.PersistenceException: No Persistence provider for EntityManager named <PUの名前> at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) : というエラーが出てきます。 08/03/25 に harada<harada.Kazuy-02@...> さんは書きました: > 原田です > > MS SQLは使ってないので、単なる質問ですが、 > persistence.xmlのtoplink.platform.class.nameを > oracle.toplink.essentials.platform.database.SQLServerPlatform > にしても、SQL Serverには日本語で格納されないということでしょうか? > > 以上 > ----- Original Message ----- > From: <sk8er.ys@...> > To: <nbdiscuss_ja@...> > Sent: Tuesday, March 25, 2008 11:47 AM > Subject: [nbdiscuss_ja] JPA(Toplink)でMS SQLのマッピングを変更するには? > > > > いつもお世話になっている苑田です。 > > > > NB6.0.1とToplink Essential、MS SQL 2005という組み合わせでの質問です。 > > (J2SDK5-12を使っています) > > > > ToplinkはOracleのサイトからダウンロードした最新のもの > > glassfish-persistence-installer-v2-b41.jar > > > > またMS SQL 2005のJDBCは > > sqljdbc_1.2.2828.100_enu.exe > > > > を使っています。 > > > > 【問題】 > > ToplinkによるEntity Beanを、例えば以下のようにします。 > > > > public class person implements Serializable{ > > > > @Entity > > : > > private String name; > > private int age; > > : > > @ > > public void setName(String name){ > > this.name = name; > > } > > public String getName(){ > > return name; > > } > > > > } > > > > これでMS SQL 2005側にPERSONというテーブルが出来て、 > > フィールドに、NAMEとAGEができるわけですが、問題は、MS SQL 2005側の > > NAMEの型が、 > > > > varchar(255); > > > > なために、NAMEで日本語の名前を扱おうとしても、データベースマネージャで > > フィールドを覗いてみると、"?????"となっています。 > > > > 問題の所在は、MS SQL 2005で日本語文字列を扱う場合は、 > > 上記のvarcharを使う場合は > > > > varchar -> nvarchar > > > > にしないといけないし、あるいはvarcharでなければ、ntext, などの型を > > 使わなければいけないというところにあるようです。 > > > > 少なくとも、ToplinkによってMS SQL側にできるフィールドがvarcharの > > ままでは、そこに日本語文字列を入れることが出来ません。 > > > > 【質問】 > > > > なるべく現在のJPAのスタイル(コーディングの手間というか)を維持しつつ > > 最も少ない手間でMS SQL 2005側に日本語文字列を入れられるように > > するにはどうしたらよいでしょう? > > > > いろいろと調べたところ、以下のような方法がありそうです。 > > > > (1)新たにマッピングを自分で作る。 > > > > Toplinkでサポートされていないデータベースを使う場合は、 > > oracle.toplink.helperとかといったクラスを拡張して、マッピングの > > 指定を明示的に行うことが出来るようです。 > > > > ただ、どれだけ手間が発生するか(あるいはoverrideすべき処理が > > どれくらいあるのか)が見えないので、手を出していません。 > > > > (2)マッピングのxmlを変更する。 > > > > config/database-schema/<db>.xml > > > > というファイルがあるので、そこのMS SQLに該当するxmlファイルをいじって > > マッピングを変更する。 > > > > これはどうもOracle JDeveloperとかを使っている場合の、アプリケーションサーバ > > > > 側の設定のようなので、今回のようにJPAをスタンドアローンで使う場合は > > 使えないようです。 > > > > (3)その他 > > > > たとえばnameに値を入れる場合に、????にならない文字列に変換して > > 入れ、取り出すときに所望の文字コードに戻すよう、Entity Beanの > > getter/setterの中に処理を書く。 > > > > たとえば、アプリケーションとしてはShitf-JISを扱い、データベース内では > > eucにするなど。 > > > > これはやってみたのですが、うまくいきませんでした。(つまり????になる) > > > > だめもとで、N'山田太郎' なんて具合に、あのNをつけても見ましたが、 > > まぁこれはだめでした。(N'??????' なんて文字列が入ってしまう) > > > > 単純な話、ToplinkとMS SQL 2005という組み合わせのときに、日本語の > > 文字列を扱えるようにしたいだけなので、他に方法があればなんでもかまいません。 > > > > (そもそも、ToplinkはOracleのもの。MS製品と組み合わせるところに > > 無理があるのか。。。。) > > > > でも、結構ありがちなケースだと思いますし、文字列で日本語を、なんてのは > > あたりまえに出てくる話だと思うのですが。。。。 > > > > 結構いろいろとネットを検索したのですが、いまのところ該当の情報には > > あたっていません。(Oracle Toplinkのフォーラムとか、MS SQLのフォーラム > > など。。。) > > > > どうかお知恵お貸しいただけると助かります。 > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > > For additional commands, e-mail: nbdiscuss_ja-help@... > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?苑田です。
すみません、Persistence.xmlの書き方を間違えてました。 最新のver2 build41では、下記のように書かないといけないようです。 <provider>oracle.toplink.essentials.PersistenceProvider</provider> <properties> <property name="toplink.target-database" value="oracle.toplink.essentials.platform.database.SQLServerPlatform"/> : </properties> これでいちおうエラー無く動作して、テーブルも作成されたのですが、 やはりStringに相当するフィールドはvarchar(255)となっており、 中のデータも ?????? などとなっており、動作は変わらないようです。 このSQLServerPlatformの中で、Stringをvarcharにマッピングすることが なされているのだろうと想像しますが、これでは日本語が扱えませんよね。 データベースは諸事情によりMS SQLを使わねばならないので、なんとか MS SQL+JPAで日本語文字列を利用できるようにしたいのですが。。。 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?原田です
少し気になったのですが >またMS SQL 2005のJDBCは > sqljdbc_1.2.2828.100_enu.exe >を使っています。 sqljdbc_1.2.2828.100_jpn.exe と同じなんでしょうか? 以上 ----- Original Message ----- From: "苑田義明" <y@...> To: <nbdiscuss_ja@...> Sent: Tuesday, March 25, 2008 3:38 PM Subject: Re: [nbdiscuss_ja] JPA(Toplink)でMS SQLのマッピングを変更するには? > 苑田です。 > > すみません、Persistence.xmlの書き方を間違えてました。 > 最新のver2 build41では、下記のように書かないといけないようです。 > > <provider>oracle.toplink.essentials.PersistenceProvider</provider> > <properties> > <property name="toplink.target-database" > value="oracle.toplink.essentials.platform.database.SQLServerPlatform"/> > : > </properties> > > これでいちおうエラー無く動作して、テーブルも作成されたのですが、 > やはりStringに相当するフィールドはvarchar(255)となっており、 > 中のデータも ?????? などとなっており、動作は変わらないようです。 > > このSQLServerPlatformの中で、Stringをvarcharにマッピングすることが > なされているのだろうと想像しますが、これでは日本語が扱えませんよね。 > > データベースは諸事情によりMS SQLを使わねばならないので、なんとか > MS SQL+JPAで日本語文字列を利用できるようにしたいのですが。。。 > > --------------------------------------------------------------------- > To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... > For additional commands, e-mail: nbdiscuss_ja-help@... > > --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?原田様
苑田です。 念のため、ご指摘いただいたjpn版に入れ替えました。 しかしながら、やはり同じようにStringはvarchar(255)フィールドとなり、 日本語を入れるとやはり、?????となります。 はやりToplinkとMS SQL server 2005の組み合わせでは 明示的に oracle.toplink.essentials.platform.database.SQLServerPlatform クラスを拡張して自前クラスを作ってマッピングをオーバーライドしないと 日本語が扱えないということでしょうか。。。 --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?苑田です。
SQLServerPlatform.classの中身を見てみたのですが、 protected Hashtable buildFieldTypes() { Hashtable fieldTypeMapping; fieldTypeMapping = new Hashtable(); fieldTypeMapping.put(Boolean.class, new FieldTypeDefinition("BIT default 0", false)); fieldTypeMapping.put(Integer.class, new FieldTypeDefinition("INTEGER", false)); fieldTypeMapping.put(Long.class, new FieldTypeDefinition("NUMERIC", 19)); fieldTypeMapping.put(Float.class, new FieldTypeDefinition("FLOAT(16)", false)); fieldTypeMapping.put(Double.class, new FieldTypeDefinition("FLOAT(32)", false)); fieldTypeMapping.put(Short.class, new FieldTypeDefinition("SMALLINT", false)); fieldTypeMapping.put(Byte.class, new FieldTypeDefinition("SMALLINT", false)); fieldTypeMapping.put(java.math.BigInteger.class, new FieldTypeDefinition("NUMERIC", 28)); fieldTypeMapping.put(java.math.BigDecimal.class, new FieldTypeDefinition("NUMERIC", 28).setLimits(28, -19, 19)); fieldTypeMapping.put(Number.class, new FieldTypeDefinition("NUMERIC", 28).setLimits(28, -19, 19)); fieldTypeMapping.put(String.class, new FieldTypeDefinition("VARCHAR", 255)); fieldTypeMapping.put(Character.class, new FieldTypeDefinition("CHAR", 1)); fieldTypeMapping.put(Byte[].class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(Character[].class, new FieldTypeDefinition("TEXT", false)); fieldTypeMapping.put(byte[].class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(char[].class, new FieldTypeDefinition("TEXT", false)); fieldTypeMapping.put(java.sql.Blob.class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(java.sql.Clob.class, new FieldTypeDefinition("TEXT", false)); fieldTypeMapping.put(java.sql.Date.class, new FieldTypeDefinition("DATETIME", false)); fieldTypeMapping.put(java.sql.Time.class, new FieldTypeDefinition("DATETIME", false)); fieldTypeMapping.put(java.sql.Timestamp.class, new FieldTypeDefinition("DATETIME", false)); return fieldTypeMapping; } ということで、Stringは VARCHARに、charなんかはTEXTにマッピングされてました。 これではうまくいくはずがありません。 ただ、気になるのが、上記SQLServerPlatformクラスの中身を見ていると、 Sybaseという文字がでてくるんですよね。 ひょっとしてSQLServerPlatformってのはSybase用なんでしょうか? とすると、MS SQL Server用は別のクラスだとか。。。? --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
|
|
Re: JPA(Toplink)でMS SQLのマッピングを変更するには?苑田です。
結局、SQLServerPlatformの中身を見て、 String, char, などに対応するフィールドを、SQLServerPlatformクラスを拡張した MSSQLServerPlatformクラスを定義した上で、buildFieldTypes() メソッドをオーバーライドしてビルドしたところ、無事MS SQL側の フィールドに日本語が書き込まれるようになりました。 なんかもっとスマートに出来るのかと思っていたのですが、 (標準でMS SQL Serverの日本語くらいはサポートしてくれるかと) たいしたコードではないにしても、自分でここまで味付けしないと 使えないってのは、Toplink + MS SQL Server ってのは マイナーなのでしょうか。。。 とりあえずこれで様子を見たいと思います。 import java.util.Hashtable; import oracle.toplink.essentials.internal.databaseaccess.FieldTypeDefinition; import oracle.toplink.essentials.platform.database.SQLServerPlatform; public class MSSQLServerPlatform extends SQLServerPlatform { @Override protected Hashtable buildFieldTypes() { Hashtable fieldTypeMapping; fieldTypeMapping = new Hashtable(); fieldTypeMapping.put(Boolean.class, new FieldTypeDefinition("BIT default 0", false)); fieldTypeMapping.put(Integer.class, new FieldTypeDefinition("INTEGER", false)); fieldTypeMapping.put(Long.class, new FieldTypeDefinition("NUMERIC", 19)); fieldTypeMapping.put(Float.class, new FieldTypeDefinition("FLOAT(16)", false)); fieldTypeMapping.put(Double.class, new FieldTypeDefinition("FLOAT(32)", false)); fieldTypeMapping.put(Short.class, new FieldTypeDefinition("SMALLINT", false)); fieldTypeMapping.put(Byte.class, new FieldTypeDefinition("SMALLINT", false)); fieldTypeMapping.put(java.math.BigInteger.class, new FieldTypeDefinition("NUMERIC", 28)); fieldTypeMapping.put(java.math.BigDecimal.class, new FieldTypeDefinition("NUMERIC", 28).setLimits(28, -19, 19)); fieldTypeMapping.put(Number.class, new FieldTypeDefinition("NUMERIC", 28).setLimits(28, -19, 19)); fieldTypeMapping.put(String.class, new FieldTypeDefinition("NVARCHAR", 255)); fieldTypeMapping.put(Character.class, new FieldTypeDefinition("NCHAR", 1)); fieldTypeMapping.put(Byte[].class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(Character[].class, new FieldTypeDefinition("NTEXT", false)); fieldTypeMapping.put(byte[].class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(char[].class, new FieldTypeDefinition("NTEXT", false)); fieldTypeMapping.put(java.sql.Blob.class, new FieldTypeDefinition("IMAGE", false)); fieldTypeMapping.put(java.sql.Clob.class, new FieldTypeDefinition("NTEXT", false)); fieldTypeMapping.put(java.sql.Date.class, new FieldTypeDefinition("DATETIME", false)); fieldTypeMapping.put(java.sql.Time.class, new FieldTypeDefinition("DATETIME", false)); fieldTypeMapping.put(java.sql.Timestamp.class, new FieldTypeDefinition("DATETIME", false)); return fieldTypeMapping; } } persistence.xmlで <properties> <property name="toplink.target-database" value="<パッケージネーム>.MSSQLServerPlatform"/> : </properties> --------------------------------------------------------------------- To unsubscribe, e-mail: nbdiscuss_ja-unsubscribe@... For additional commands, e-mail: nbdiscuss_ja-help@... |
| Free Forum Powered by Nabble | Forum Help |