[Seasar-user:20927] Re: S2JDBCにて、Mysqlのboolean型のカラムに文字列を挿入しようとする。

Masao Suda [E-MAIL ADDRESS DELETED]
2011年 7月 29日 (金) 09:06:30 JST


須田です。
お世話になっております。

> 中村(taedium)です。
>
> エラーメッセージに
> 「Cannot add or update a child row: a foreign key constraint fails 」
> とありますから、エラーの根本的な原因はFKの参照制約違反にあるのでは
> ないかと思います。
中村様のご指摘を参考に、FKを一旦はずして、migrateしなおしたところupdate
されました。
参照制約に引っかかっていたようです。

> S2JDBCが出力するログですが、必ずしもそのまま実行できるとは限らないで
> す。 特にboolean型やDate型のようにRDBMSごとに扱いが微妙に違うものにつ
> いては。 S2JDBCが出力するログはPreparedStatementで発行されているSQL中
> の「?」を わかりやすいようにパラメータの値で置換しているのですが、 そ
> のときにboolean型の値はシングルクォートで囲まれます。 これはMySQLでは
> 不適切でも、他のRDBMS(SQL Serverとか)では適切なのだ と思います。 
情報ありがとうございます。勉強になりました。

ご返答頂いた皆様、ありがとうございました。
>> MYSQL でコマンドプロンプトから流してみましたが。
>>
>> mysql> create table aa (id int, flg boolean default true);
>> Query OK, 0 rows affected (0.17 sec)
>>
>> mysql> insert into aa values (1, true)
>>     -> ;
>>
>> Query OK, 1 row affected (0.08 sec)
>>
>> mysql> insert into aa values (1, 'true')
>>     -> ;
>>
>> ERROR 1366 (HY000): Incorrect integer value: 'true' for column 'flg' at row 1
>>
>> となり
>>
>> mysql は 変数:true であって 文字列:'true' でないため MySQLException が発生しているようですね。
>>
>>
>>
>>
>>
>>
>>
>> 2011年7月28日17:58 Masao Suda <[E-MAIL ADDRESS DELETED]>:
>>> 小林様、吉田様
>>> 須田です。お世話になっております。
>>>
>>> 一応Eclipseでデバッグしながら jdbcManagerの中身も覗いてみたのですが、
>>> dialect= MysqlDialect と設定されています。
>>>
>>>> 小林 (koichik) です.
>>>>
>>>> s2jdbc.dicon で MySQL の dialect を設定しているか確認してください。
>>>> boolean 型をサポートしてない Oracle あたりになってないでしょうか?
>>>>
>>>> http://s2container.seasar.org/2.4/ja/s2jdbc_setup.html#ダイアレクト
>>>>
>>>> Date: Thu, 28 Jul 2011 17:01:46 +0900
>>>> From: Masao Suda <[E-MAIL ADDRESS DELETED]>
>>>> Subject: [Seasar-user:20912] S2JDBCにて、Mysqlのboolean型のカラムに文字列を挿入しようとする。
>>>>
>>>>> 須田と申します。
>>>>> お世話になっております。
>>>>>
>>>>> S2JDBCを利用しているのですが、以下のエラーが発生してしまいます。
>>>>> ログ出力されているSQLをMySQLで実行すると、
>>>>> ERROR 1366 (HY000): Incorrect integer value: 'true' for column 'SYSTEM_FLG' at row 1
>>>>> となるため、boolean型に文字列を設定しようとしているのが原因と思われるのですが、
>>>>> 解決するにはどのような設定をすればよいでしょうか?
>>>>>
>>>>> --- ログ ---
>>>>> DEBUG 2011-07-28 16:44:45,671 ["http-bio-8080"-exec-7] update user set ACCOUNT = 'admin', NAME = 'システム管理者', PASSWORD = 'password', MAIL_ADDRESS = '', SYSTEM_FLG = 'true', DEPARTMENT_ID = 0, CREATE_TIMESTAMP = '2011-07-08 00:03:23', UPDATE_TIMESTAMP = '2011-07-28 16:44:45.671000000', DELETE_TIMESTAMP = null, VERSION = VERSION + 1 where ID = 1 and VERSION = 0
>>>>> DEBUG 2011-07-28 16:44:45,671 ["http-bio-8080"-exec-7] END jp.co.interaction_i.service.UserService#update([E-MAIL ADDRESS DELETED]) Throwable:org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[update user set ACCOUNT = ?, NAME = ?, PASSWORD = ?, MAIL_ADDRESS = ?, SYSTEM_FLG = ?, DEPARTMENT_ID = ?, CREATE_TIMESTAMP = ?, UPDATE_TIMESTAMP = ?, DELETE_TIMESTAMP = ?, VERSION = VERSION + 1 where ID = ? and VERSION = ?], Message=[[ESSR0072]SQLで例外(SQL=[update user set ACCOUNT = ?, NAME = ?, PASSWORD = ?, MAIL_ADDRESS = ?, SYSTEM_FLG = ?, DEPARTMENT_ID = ?, CREATE_TIMESTAMP = ?, UPDATE_TIMESTAMP = ?, DELETE_TIMESTAMP = ?, VERSION = VERSION + 1 where ID = ? and VERSION = ?], Message=[1452], ErrorCode=23000, SQLState={3})が発生しました : [SQLで例外(Message=[Cannot add or update a child row: a foreign key constraint fails (`sgpr001`.`user`, CONSTRAINT `user_FK1` FOREIGN KEY (`DEPARTMENT_ID`) REFERENCES `department`!
>  (`!
>>>  ID`!
>>>>>  ))], ErrorCode=1452, SQLState=23000)が発生しました。], [Cannot add or update a child row: a foreign key constraint fails (`sgpr001`.`user`, CONSTRAINT `user_FK1` FOREIGN KEY (`DEPARTMENT_ID`) REFERENCES `department` (`ID`))], ErrorCode=1452, SQLState=23000)が発生しました
>>>>> DEBUG 2011-07-28 16:44:45,718 ["http-bio-8080"-exec-7] トランザクションをロールバックしました。tx=[FormatId=4360, GlobalId=1311838291468/17, BranchId=]
>>>>>
>>>>> --- DDL ---
>>>>> create table user (
>>>>>     ID bigint not null auto_increment,
>>>>>     ACCOUNT varchar(20) not null,
>>>>>     NAME varchar(50),
>>>>>     PASSWORD varchar(20) not null,
>>>>>     MAIL_ADDRESS varchar(255),
>>>>>     SYSTEM_FLG boolean default false,
>>>>>     DEPARTMENT_ID bigint,
>>>>>     CREATE_TIMESTAMP datetime,
>>>>>     UPDATE_TIMESTAMP datetime,
>>>>>     DELETE_TIMESTAMP datetime,
>>>>>     VERSION bigint,
>>>>>     constraint user_PK primary key(ID)
>>>>> );
>>>>>
>>>>> --- エンティティ(一部) ---
>>>>>      /**
>>>>>       * システムフラグ
>>>>>       */
>>>>>      @Column(columnDefinition="default false")
>>>>>      public boolean systemFlg;
>>>>>
>>>>> --- jdbc.dicon ---
>>>>>      <component name="xaDataSource"
>>>>>              class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
>>>>>              <property name="driverClassName">
>>>>>                      "com.mysql.jdbc.Driver"
>>>>>              </property>
>>>>>              <property name="URL">
>>>>>                      "jdbc:mysql://localhost:3306/proj001"
>>>>>              </property>
>>>>>              <property name="user">"projuser"</property>
>>>>>              <property name="password">"projpass"</property>
>>>>>      </component>
>>>>>
>>>>>
>>>>> --- 環境 ---
>>>>> jdk:1.6.0_24
>>>>> Seasar:2.4.44
>>>>> SaStruts:1.0.4-sp8
>>>>> S2jdbc-gen:2.4.44
>>>>> Eclipse:Indigo(build id:20110615-0604)
>>>>> Dolteng:0.41.0
>>>>> Apatche-tomcat:7.0.16
>>>>> MySQL:essential-5.1.57
>>>>>
>>>>>
>>>>>
>>>> --
>>>> {
>>>>   name: "Koichi Kobayashi",
>>>>   mail: "[E-MAIL ADDRESS DELETED]",
>>>>   blog: "http://d.hatena.ne.jp/koichik/",
>>>>   twitter: "@koichik"
>>>>  }
>>>>
>>>> _______________________________________________
>>>> Seasar-user mailing list
>>>> [E-MAIL ADDRESS DELETED]
>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>
>>> _______________________________________________
>>> Seasar-user mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>
>> _______________________________________________
>> Seasar-user mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-user



Seasar-user メーリングリストの案内