2006年08月22日

テーブルのフィールド名を変更したらアプリ実行時にエラー

【トラブル】
テーブルのフィールド名を変更することになったのでJavaのO/RマッピングツールTorqueでproject-schema.xmlを変更してラッパクラスを更新するためにAntタスク実行

新しいラッパクラスをEclipseプロジェクトのものに上書きして、またプロジェクト中のエンティティクラスなどの名称も新フィールド名に合わせて変更して全てコンパイルが成功していることを確認

その後、アプリケーションを実行したら以下のエラーとなった。

java.sql.SQLException: Unknown column 'user_table.KANJYO_MOTOCHO_LIST' in 'field list'
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2921)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2972)
at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)
at com.mysql.jdbc.Statement.executeQuery(Statement.java:822)
at com.workingdogs.village.QueryDataSet.(QueryDataSet.java:113)
at org.apache.torque.util.BasePeer.executeQuery(BasePeer.java:1539)
at org.apache.torque.util.BasePeer.doSelect(BasePeer.java:1391)
at org.apache.torque.util.BasePeer.doSelect(BasePeer.java:1368)
at net.ssw2005.kaikei.model.torque.BaseUserTablePeer.doSelectVillageRecords(BaseUserTablePeer.java:417)
at net.ssw2005.kaikei.model.torque.BaseUserTablePeer.doSelectVillageRecords(BaseUserTablePeer.java:386)
at net.ssw2005.kaikei.model.torque.BaseUserTablePeer.doSelect(BaseUserTablePeer.java:354)
at net.ssw2005.kaikei.model.biz.KaikeiDBImpl.deleteAllUserTbl(KaikeiDBImpl.java:71)
at net.ssw2005.kaikei.model.biz.KaikeiDBTest.initializeTables(KaikeiDBTest.java:292)
at net.ssw2005.kaikei.action.koueki.NendoKurikoshiCompleted4720ActionTest.testSuccess(NendoKurikoshiCompleted4720ActionTest.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:421)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:305)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:186)
....(以下省略)


【原因】
ラッパクラスだけ変更してデータベースのフィールド名を変更するのを忘れていた。(大ボケです(大汗;;)
TorqueのGeneratorを使うとデータベース自体を削除してしまい、既存のデータが消えてしまうので手動でフィールドを追加するともりだった。

【解決】
以下のコマンドでMySQLのテーブルにフィールドを追加

MySQLでフィールド名の変更する場合のコマンド
(kanjyo_motochor_list→kanjyo_motocho_list)

mysql> alter table user_table change kanjyo_motochor_list kanjyo_motocho_list int;

『以下参考』
新フィールドを追加する場合のコマンド
(テーブルの末尾ではなく、任意の場所に挿入する場合、
 この場合はフィールドorganization_idの直後に挿入する)
mysql> alter table kamoku_zandaka_table add kaikei_kubun int after organization_id;

【解決へのヒント】
自分が今何をやっているのかを見つめ直そう!

【脱出までの所要時間】
20分(←こんな単純な大ボケに時間かかりすぎ!)


2006年08月14日

TorqueのGenaratorでエラー

【トラブル】
JavaのO/Rマッピングツール「Torque」を使って開発中のWebアプリケーションのテーブルを変更した。
「Torque」のGenaratorを使って、テーブル定義をしたファイル「project-schema.xml」からラッパクラスとSQL文を作成しようと以下のようにAntを動かしたところ、

C:\torque-gen-3.1>ant -f build-torque.xml

普段見たことのない以下のエラーが出て処理が途中で止まった。



Buildfile: build-torque.xml

main:

check-use-classpath:

check-run-only-on-schema-change:

sql-check:

sql:
[echo] +------------------------------------------+
[echo] | |
[echo] | Generating SQL for YOUR Torque project! |
[echo] | |
[echo] +------------------------------------------+

sql-classpath:

sql-template:
[echo] loading templates from templates
[torque-sql] Using contextProperties file: C:\torque-gen-3.1\build.properties
[torque-sql] Generating to file C:\torque-gen-3.1\src\sql\report.ssw2005.sql.gen
eration
[torque-sql] [INFO] XmlToAppData - -Parsing file: 'id-table-schema.xml'
[torque-sql] [INFO] DTDResolver - -Resolver: used database.dtd from 'org.apache.
torque.engine.database.transform' package
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , unique-column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , unique) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , table) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , database) called
[torque-sql] [INFO] XmlToAppData - -Parsing file: 'project-schema.xml'
[torque-sql] [INFO] DTDResolver - -Resolver: used database.dtd from 'org.apache.
torque.engine.database.transform' package
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called
[torque-sql] [DEBUG] XmlToAppData - -endElement(, , column) called

BUILD FAILED
C:\torque-gen-3.1\build-torque.xml:112: The following error occurred while execu
ting this line:
C:\torque-gen-3.1\build-torque.xml:174: The following error occurred while execu
ting this line:
C:\torque-gen-3.1\build-torque.xml:207: org.apache.torque.engine.EngineException
: Element type "column" must be followed by either attribute specifications, ">"
or "/>".

Total time: 2 seconds


【原因】
テーブルの変更に伴って修正した「project-schema.xml」に誤りがあった。

<column name="category"
type="INTEGER"
required="false"
description=""0:booklet" /> ←(ここ)

descriptionのダブルクォーテーションで囲むべき値が正しく記述されていなかった。

【解決】
description="0:booklet"
と、この部分を修正したところ、問題なくAntの処理が終わった。

【解決へのヒント】
エラーメッセージが英語であろうが何だろうがしっかり読む。
Element type "column" must be followed by either attribute specifications, ">"
or "/>".

(訳?)"column"は、">"または"/>"の後に続くべきである。

【脱出までの所要時間】
15分


2006年08月13日

Javaプログラムの実行エラー

【トラブル】
Linuxのcornで定期的に起動しているjavaプログラムが以下のメッセージを吐いて動かなくなった。

Exception in thread "main" java.lang.ClassFormatError: Unknown constant tag in .class file
at java.text.SimpleDateFormat.(SimpleDateFormat.java:476)
.......................
.......................

このプログラムは、”リマインダー機能”プログラムで、テーブルにイベントがある場合にメールを送ってくれるものだが、毎日定時に送るように設定していたイベントのメールが来なくなったのでおかしいと思って調べたら止まっていた。

【原因】
不明

【解決】
PCを、再起動したら直った。

”Unknown constant tag in .class file”をキーワードにヤフーで検索して得られた掲示板に「再起動」の文字があり、以前のことを思い出した。確か、全く同じ事象で悩んだ記憶がある。

やはり、こうやって記録を付けることが重要になりそうだ。

【脱出までの所要時間】
30分