<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>java</title><link>http://blogs.wankuma.com/ahaha/category/1887.aspx</link><description>java</description><managingEditor>あはは。ahaha@wankuma.com</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>あはは。ahaha@wankuma.com</dc:creator><title>[java]reflectionを使って、引数のobjectの文字列化する。　ってやっぱり遅いんだなぁと</title><link>http://blogs.wankuma.com/ahaha/archive/2008/12/20/164494.aspx</link><pubDate>Sat, 20 Dec 2008 05:22:00 GMT</pubDate><guid>http://blogs.wankuma.com/ahaha/archive/2008/12/20/164494.aspx</guid><wfw:comment>http://blogs.wankuma.com/ahaha/comments/164494.aspx</wfw:comment><comments>http://blogs.wankuma.com/ahaha/archive/2008/12/20/164494.aspx#Feedback</comments><slash:comments>175</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ahaha/comments/commentRss/164494.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ahaha/services/trackbacks/164494.aspx</trackback:ping><description>entityやら構造体やら、値を入れる入れ物を書くと大抵&lt;br&gt;
toString()メソッドをoverrideしているかと思うわけですが、&lt;br&gt;
毎回書くのは結構かったるい訳です。&lt;br&gt;
DBのスキーマを元に、とかだと自動生成ツールがいろいろとあったりするわけですが、&lt;br&gt;
時には自作しなければいけないもの。&lt;br&gt;
&lt;br&gt;
で、reflectionでそこを楽にできないかなぁと調べた結果がこれ。&lt;br&gt;
(下部にソース添付)&lt;br&gt;

loopで10万回繰り返して、作成したentityで試してみた。&lt;br&gt;
結果：&lt;br&gt;
　reflectionを使用したもの：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;12秒358&lt;br&gt;
　普通にtoString()を実装&amp;nbsp;&amp;nbsp;&amp;nbsp;0秒180&lt;br&gt;
　(StringBuilderで文字を組み立てたもの)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;

(´・ｪ・｀)&amp;nbsp;・・・違い過ぎる。&lt;br&gt;
うーん、マシンスペックやらを省略してますけど、それでもこんなに違うとは。&lt;br&gt;
utility的にreflectionを多用したら開発が楽できるかな？&lt;br&gt;
と思ったのですが後のパフォーマンスチューニングに苦しみそうですね。&lt;br&gt;
それにこれ、配列とかリストとか全然対応してないし。&lt;br&gt;
&lt;br&gt;
とすると、次なる候補はvelocityなどのTemplateEngine系になりそうです。&lt;br&gt;
(使用しているFrameworkのソースをみたらおもしろそうだったので)&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
package&amp;nbsp;jp.co.ahaha.reflection;&lt;br&gt;

import&amp;nbsp;java.lang.reflect.Field;&lt;br&gt;
import&amp;nbsp;java.lang.reflect.Modifier;&lt;br&gt;

import&amp;nbsp;javax.persistence.Column;&amp;nbsp;&amp;nbsp;//geronimo-jpa_3.0_spec-1.0jar&amp;nbsp;を使用&lt;br&gt;

public&amp;nbsp;class&amp;nbsp;ReflectionSample&amp;nbsp;{&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;受け取ったobjectを、　フィールド名=値　の形式でカンマ区切りにした文字列表現で返却します。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;ただし、final　と　static&amp;nbsp;で宣言された項目については呼び出す予定はありません。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;また、もしそのobjectがentityである場合(=javax.persistence.Columnアノテーションが付加されている場合)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;フィールド名の代わりに、Columnアノテーションの名前を用いて　出力します。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;こちらは、返却される文字列には改行コードは含まれません。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;final&amp;nbsp;String&amp;nbsp;toValueOneLine(Object&amp;nbsp;value)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;ReflectionSample.toValue(value,false);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;受け取ったobjectを、　フィールド名=値　の形式でカンマ区切りにした文字列表現で返却します。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;ただし、final　と　static&amp;nbsp;で宣言された項目については呼び出す予定はありません。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;また、もしそのobjectがentityである場合(=javax.persistence.Columnアノテーションが付加されている場合)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;フィールド名の代わりに、Columnアノテーションの名前を用いて　出力します。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;こちらは、返却される文字列の　フィールド名=値のペア毎に改行します。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;value&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;final&amp;nbsp;String&amp;nbsp;toValueMulti(Object&amp;nbsp;value)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;ReflectionSample.toValue(value,true);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;final&amp;nbsp;static&amp;nbsp;String&amp;nbsp;toValue(Object&amp;nbsp;value,&amp;nbsp;boolean&amp;nbsp;multiLine)&amp;nbsp;{&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//for&amp;nbsp;NullException&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(value&amp;nbsp;==&amp;nbsp;null)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;"null";&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;endOfLine&amp;nbsp;=&amp;nbsp;"";&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(multiLine)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;endOfLine&amp;nbsp;=&amp;nbsp;"\n";&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//get&amp;nbsp;public&amp;nbsp;field(Seasar&amp;nbsp;entity)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Field[]&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;value.getClass().getFields();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;accessPrivate&amp;nbsp;=&amp;nbsp;false;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(fields&amp;nbsp;==&amp;nbsp;null&amp;nbsp;||&amp;nbsp;fields.length&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//get&amp;nbsp;normal&amp;nbsp;javaBeans&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fields&amp;nbsp;=&amp;nbsp;value.getClass().getDeclaredFields();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;accessPrivate&amp;nbsp;=&amp;nbsp;true;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuilder&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuilder(1024);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(Field&amp;nbsp;f:&amp;nbsp;fields)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(accessPrivate)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f.setAccessible(accessPrivate);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//dont&amp;nbsp;get&amp;nbsp;Final&amp;nbsp;or&amp;nbsp;Static&amp;nbsp;fields&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Modifier.isFinal(f.getModifiers())&amp;nbsp;&amp;&amp;&lt;br&gt;
!Modifier.isStatic(f.getModifiers()))&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//columnName&amp;nbsp;(fieldName)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(toFieldString(f));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append("=");&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//columnValue&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;temp&amp;nbsp;=&amp;nbsp;f.get(value);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(temp&amp;nbsp;==&amp;nbsp;null)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append("null");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(temp.toString());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(",");&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(endOfLine);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;catch&amp;nbsp;and&amp;nbsp;proceed&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();&amp;nbsp;//need&amp;nbsp;log&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sb.toString();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;if&amp;nbsp;field&amp;nbsp;has&amp;nbsp;javax.persistence.Column&amp;nbsp;annotation&amp;nbsp;and&amp;nbsp;(name&amp;nbsp;is&lt;br&gt;
not&amp;nbsp;null)&amp;nbsp;then&amp;nbsp;return&amp;nbsp;column.name&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;else&amp;nbsp;return&amp;nbsp;field&amp;nbsp;name&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;f&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;final&amp;nbsp;static&amp;nbsp;String&amp;nbsp;toFieldString(Field&amp;nbsp;f)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Column&amp;nbsp;c&amp;nbsp;=&amp;nbsp;f.getAnnotation(Column.class);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;!=&amp;nbsp;null&amp;nbsp;&amp;&amp;&amp;nbsp;c.name()&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;c.name();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;f.getName();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
}&lt;br&gt;&lt;img src ="http://blogs.wankuma.com/ahaha/aggbug/164494.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あはは。ahaha@wankuma.com</dc:creator><title>Seasar Conference 2008に行ってきたわけでして</title><link>http://blogs.wankuma.com/ahaha/archive/2008/09/07/155760.aspx</link><pubDate>Sun, 07 Sep 2008 02:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/ahaha/archive/2008/09/07/155760.aspx</guid><wfw:comment>http://blogs.wankuma.com/ahaha/comments/155760.aspx</wfw:comment><comments>http://blogs.wankuma.com/ahaha/archive/2008/09/07/155760.aspx#Feedback</comments><slash:comments>341</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ahaha/comments/commentRss/155760.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ahaha/services/trackbacks/155760.aspx</trackback:ping><description>( ´ー｀)y-~~一番行きたかった、＋お会いしたかったのが　DBFlute 開発者のjfluteさん、&lt;br&gt;
1番最初の時間で、飯田橋駅降りた後に迷っていたので&lt;br&gt;
時間に間に合ってよかった( ´ー`)フゥー．．．&lt;br&gt;

Webに上がってあるDocument系はざっと目を通していたんだけども&lt;br&gt;
それでもまだまだ機能のうち使いこなせていないのが多かったなぁと反省。&lt;br&gt;

以下、月曜日以降に試そうと思っているもの&lt;br&gt;
・S2Unitによってテストケース毎にxlsでデータを準備して、テスト前にデータ投入ができるけど&lt;br&gt;
　テーブルの列の増減等が多い場合、&lt;br&gt;
　DBの変更に追従できなくて逆にテストしなくなっちゃう問題&lt;br&gt;
　→Replace-Schema.bat(sh)を用いて、DBデータを一か所にまとめておきましょう&lt;br&gt;
&lt;br&gt;&lt;br&gt;

・DDLを生成、変更、削除があったときに、古いテーブルが残っちゃっていてそれのentityも生成しちゃってる問題&lt;br&gt;
　→今使っているのがdbflute-s2jdbcの0.7.3 だけども、最新だと0.7.9があって、少し前から&lt;br&gt;
　　&lt;br&gt;
　　　build.propertiesの方で&lt;br&gt;
　　　torque.isDeleteOldTableClass = true&lt;br&gt;
　　　と設定すれば消せるらしい事&lt;br&gt;
&lt;br&gt;
あたりでしょうか。&lt;br&gt;
2か月くらい前に見ていた時はdbflute-s2jdbcがリリースされたばかりのためか、&lt;br&gt;
S2Dao版のはbuildバージョンが上がってるけどS2JDBC版は上がらないなぁ&lt;br&gt;
とwatchをやめていたんですよね。&lt;br&gt;
( ´ー｀)y-~~うーん、webでの情報収集の考え方、方法をもう少し考えないとなぁ。&lt;br&gt;
&lt;br&gt;
以下今後の自分のタスク&lt;br&gt;
・外部キーを張ると、テストデータとか入れる時大変なんだよねーだから張らないんだ。&lt;br&gt;
　っていう管理者、DBA、開発者の人に対して、どうやれば楽にデータ投入などできるから貼りましょうよ&lt;br&gt;
　って説明するための、具体的な楽になる手順の提示&lt;br&gt;
　(自動生成系ツールがテーブルのメタデータにアクセスして作成しようとしているのに、上記だと無理だから)&lt;br&gt;
&lt;br&gt;
↑&lt;br&gt;
jfluteさん、教えていただきありがとうございます。・・・・&lt;br&gt;
&lt;br&gt;
ってうわー、あのあと「DBFluteユーザの集い２」ってあったんですね？&lt;br&gt;
サイトを確認しておけばよかった  つД｀)･ﾟ･&lt;br&gt;
&lt;P&gt;&lt;A href="http://d.hatena.ne.jp/jflute/20080905"&gt;http://d.hatena.ne.jp/jflute/20080905&lt;/A&gt;&lt;/P&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
・O/Rマッパで　　列がnotnullでも、ラッパクラスとして作成されるものが多いのはなぜか？&lt;br&gt;
　いくつか見ているとnotnullだとプリミティブ型　になるものと、それでもラッパクラスになるものがあるみたいだけど&lt;br&gt;
　それはどういった理由・方針からなのか、&lt;br&gt;
　→今回のプロジェクトではすべての列がnotnullで数値なら0、日付は1900年1月1日、文字系は""が入るようになっているが&lt;br&gt;
　　dbflute-s2jdbcではすべてラッパクラス。&lt;br&gt;
　　で、他の開発者、受け入れ元の会社の方からの依頼があったのでやむを得ず&lt;br&gt;
    mydbflute\dbflute-0.7.3\template\om\java\other\s2jdbc\entity\S2jdbcExtendedEntity.vm&lt;br&gt;
   のテンプレートに&lt;br&gt;
　　コンストラクタを追加するよう定義。&lt;br&gt;
　　コンストラクタにおいて自分自身を渡す  DefalutSetter.toSet(this);&lt;br&gt;
　　みたいなメソッドを作ってその中でリフレクションで上記フィールド系にデフォルト値をセットするようにしてみた&lt;br&gt;
&lt;br&gt;
　　( ´ー｀)y-~~うーん、ここら辺はもっといろんな人の批評が聞きたいところだなぁもっとほかにいい方法あるんじゃないかなぁ？&lt;br&gt;
　　(Listで1000件作成するときに、通常と比べて１GBメモリのマシンで大体1秒くらいの速度差だったからよしとしたんだけども)&lt;br&gt;
&lt;br&gt;
　　&lt;br&gt;
&lt;br&gt;
・ここら辺も読むこと&lt;br&gt;
  http://www.agiledata.org/essays/mappingObjects.html&lt;br&gt;
  http://c2.com/cgi-bin/wiki?ObjectRelationalToolComparison&lt;br&gt;
  http://www.martinfowler.com/eaaCatalog/&lt;br&gt;
&lt;br&gt;
・情報収集の在り方についてもう少しきちんとWebと向き合おう。&lt;br&gt;
　→vbaとかクラサバにかかわってた時間が長すぎるからどうしてもwebの知識が足りなすぎるし、コツコツ集めましょう&lt;br&gt;
&lt;br&gt;
&gt;中さん&lt;br&gt;
すいません、わんくまに見る勉強会開催のススメ&lt;br&gt;
という題で講演をされているのは知っていたのですが&lt;br&gt;
裏番組の、「Seasarの中の中」&lt;br&gt;
というAOPの仕組み javaassistの方が興味あったのでそっち行ってましたー♪いやー楽しかったー♪&lt;br&gt;
&lt;br&gt;
( ´ー｀)y-~~そして明日は、(今日は)java勉強会です。&lt;br&gt;
http://www.dalf.jp/wiki/java/doku.php&lt;br&gt;
http://www.dalf.jp/wiki/java/doku.php?id=dalf-java-type1-00062100-029&lt;br&gt;
↑&lt;br&gt;
とりあえずこんな感じで作っていて、&lt;br&gt;
同じ画面を、いろんなフレームワークで作るとどうなるの？どう違うの？&lt;br&gt;
っていうのをやっています。&lt;br&gt;
&lt;img src ="http://blogs.wankuma.com/ahaha/aggbug/155760.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>あはは。ahaha@wankuma.com</dc:creator><title>S2JDBC_IterationCallBackのメモ</title><link>http://blogs.wankuma.com/ahaha/archive/2008/07/10/148239.aspx</link><pubDate>Thu, 10 Jul 2008 00:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/ahaha/archive/2008/07/10/148239.aspx</guid><wfw:comment>http://blogs.wankuma.com/ahaha/comments/148239.aspx</wfw:comment><comments>http://blogs.wankuma.com/ahaha/archive/2008/07/10/148239.aspx#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://blogs.wankuma.com/ahaha/comments/commentRss/148239.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/ahaha/services/trackbacks/148239.aspx</trackback:ping><description>&lt;P&gt;S2JDBCのtutorialソースを読んでいて、自分で追加してテストした内容&lt;BR&gt;&lt;A href="http://s2container.seasar.org/2.4/ja/s2jdbc_manager_auto.html"&gt;http://s2container.seasar.org/2.4/ja/s2jdbc_manager_auto.html&lt;/A&gt;#イテレーションによる検索&lt;BR&gt;tutorialは2.4.25&lt;BR&gt;&lt;A href="http://s2container.seasar.org/download/2008-04-18/S2JDBC-Tutorial-2.4.25.zip"&gt;http://s2container.seasar.org/download/2008-04-18/S2JDBC-Tutorial-2.4.25.zip&lt;/A&gt;&lt;BR&gt;( &amp;#180;ー｀)y-~~んー、普通ならばListでデータを全部受け取って、for のloopなりでまわせば良いけど&lt;BR&gt;メモリの関係とかで一件ずつ行いたい場合はどうなるんだ？ってことでjavadocみたりしながらやってみた&lt;BR&gt;/*&lt;BR&gt;&amp;nbsp;* Copyright 2004-2008 the Seasar Foundation and the Others.&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* Licensed under the Apache License, Version 2.0 (the "License");&lt;BR&gt;&amp;nbsp;* you may not use this file except in compliance with the License.&lt;BR&gt;&amp;nbsp;* You may obtain a copy of the License at&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://www.apache.org/licenses/LICENSE-2.0"&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/A&gt;&lt;BR&gt;&amp;nbsp;*&lt;BR&gt;&amp;nbsp;* Unless required by applicable law or agreed to in writing, software&lt;BR&gt;&amp;nbsp;* distributed under the License is distributed on an "AS IS" BASIS,&lt;BR&gt;&amp;nbsp;* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,&lt;BR&gt;&amp;nbsp;* either express or implied. See the License for the specific language&lt;BR&gt;&amp;nbsp;* governing permissions and limitations under the License.&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;package examples.entity;&lt;/P&gt;
&lt;P&gt;import org.seasar.extension.jdbc.IterationCallback;&lt;BR&gt;import org.seasar.extension.jdbc.IterationContext;&lt;BR&gt;import org.seasar.extension.jdbc.JdbcManager;&lt;BR&gt;import org.seasar.extension.unit.S2TestCase;&lt;/P&gt;
&lt;P&gt;/**&lt;BR&gt;&amp;nbsp;* @author koichik&lt;BR&gt;&amp;nbsp;*/&lt;BR&gt;public class IterateTest extends S2TestCase {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private JdbcManager jdbcManager;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void setUp() throws Exception {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; include("app.dicon");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;//******************ここから追加したもの******************&lt;BR&gt;&amp;nbsp; public void testIterateMonomaneTx() throws Exception {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jdbcManager.from(Employee.class).iterate(new EmployeeHandler());&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;//こっちが受け取るほう&lt;BR&gt;import org.seasar.extension.jdbc.IterationCallback;&lt;BR&gt;import org.seasar.extension.jdbc.IterationContext;&lt;BR&gt;import org.seasar.extension.jdbc.JdbcManager;&lt;BR&gt;import org.seasar.framework.container.SingletonS2Container;&lt;/P&gt;
&lt;P&gt;public class EmployeeHandler implements IterationCallback&amp;lt;Employee, Employee&amp;gt; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ここが、通常のsql実行ならばloopでぐるぐる回す所に該当し、1件ずつ通知される&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Employee iterate(Employee entity, IterationContext context) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(entity.name);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; otherSqlExecute(entity);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return entity;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void otherSqlExecute(Employee entity) {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JdbcManager jdbcmanager = SingletonS2Container.getComponent(JdbcManager.class);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Department d = jdbcmanager.from(Department.class)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .where("id = ?", entity.departmentId).getSingleResult();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(d.name);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;( &amp;#180;ー｀)y-~~テストで実行してみて確かに動作することはするんだけども&lt;/P&gt;
&lt;P&gt;　ちょっと設計として正しいのか自信が無かったりするので後で&lt;/P&gt;
&lt;P&gt;IterationCallBackという考え方について調べてみようっと&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/ahaha/aggbug/148239.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>