[Seasar-user:18318] Re: DBFlute でシーケンス値取得

kubo [E-MAIL ADDRESS DELETED]
2009年 8月 18日 (火) 22:09:15 JST


久保(jflute)です。

OutsideSqlTestに関しては、この記事からリンクされている
カンファレンスの資料に(簡単ですが)説明がありますので
ぜひご覧下さい。
http://d.hatena.ne.jp/jflute/20080907/1220775232

2009/8/18 HATTI <[E-MAIL ADDRESS DELETED]>:
> お世話になっております。
> hatti です。
>
> jflute さん直々にお返事いただけるとはありがたいです。
> さすがはML!!
>
>> OutsideSqlTestタスクを実行することでシーケンス取得のSQLの
>> 妥当性はチェックすることが可能です。
> こちら、参考にさせていただきます。
> まだ学習中なもので、全体が把握できていなくて、、、
>
>> これって恐らく別スレッドで話題になっている
>> 「論理削除連番カラム」で利用するものですよね。
> これもそのうちの1つですが、
> 現在仕事のプロジェクトでは、これ以外にも主キー以外のシーケンスを利用しています。
> 論理削除番号は全テーブル共通のシーケンスですが、
> 個々のテーブルのみに使用するシーケンスも存在しています。
>
> 以上、よろしくお願いいたします。
>
> 2009/08/18 21:15 に kubo<[E-MAIL ADDRESS DELETED]> さんは書きました:
>> 久保(jflute)です。
>>
>> hattiさん、こんばんは
>> 結論からずばり、
>> 「PK以外のカラムでのシーケンス利用は外だしSQLで」
>> でお願いします。
>> タイプセーフをご心配されているようですが、
>> OutsideSqlTestタスクを実行することでシーケンス取得のSQLの
>> 妥当性はチェックすることが可能です。
>>
>> 個人的には、シーケンスをPK以外で利用することは
>> ほとんどなく、また、万が一あったとしても利用箇所は
>> そんなに多くはならないかと。
>> これって恐らく別スレッドで話題になっている
>> 「論理削除連番カラム」で利用するものですよね。
>> それに関してはそちらのスレッドにて。
>>
>> #
>> # mokkouyouさん、西山さん、フォローありがとうございます!
>> # とてもとても助かります。
>> #
>>
>> 2009/8/11 西山 はじめ <[E-MAIL ADDRESS DELETED]>:
>>> 西山です。
>>>
>>>> シーケンス名などを外から文字列などで渡すと、
>>>> シーケンス名(DB定義)が変わった際に、タイプセーフに再自動生
>>> 成できないのかなと
>>>> 考えています。
>>>
>>> シーケンス名の自動生成は、無かったと思います。
>>>
>>> シーケンスに対応しているテーブル名、カラム名が固定であるので
>>> したら(SEQ_というSUFFIXで固定など・・・)、bsentity.dbmeta
>>> パッケージにDBのメタ情報が含まれてますので、そちらを利用出来
>>> ます。
>>>
>>> テーブル名=HogeTableDbm.getInstance().getTableDbName;
>>> カラム名=HogeTableDbm.getInstance().columnFooBar().
>>> getColumnDbName()
>>>
>>> あとは、mokkouyouさんのおっしゃったとおりに、DbMetaにシーケ
>>> ンスと対応付けるよう実装してみるくらいでしょうか。
>>>
>>> 以上よろしくお願いいたします。
>>>
>>> [2009/08/11 14:37] HATTI さんは書きました。:
>>>> hatti です。
>>>> ご回答ありがとうございます。
>>>>
>>>>> mokkouyouさんのおっしゃっている通り、現時点のDBFluteでは主
>>>>> キー以外のSequenceを特定のカラムと対応付ける機能は無いと思い
>>>>> ます。(調べた限りでは・・・ですが)
>>>> 私も色々と検索したのですが、やはりそうですか。
>>>>
>>>>> hattiさんが行いたいことは、「insert時にシーケンスに対応して
>>>>> いるカラムの値を自動設定したい」だと思うのですが、
>>>> これも行いたい事の1つなのですが、
>>>> シーケンス名などを外から文字列などで渡すと、
>>>> シーケンス名(DB定義)が変わった際に、タイプセーフに再自動生成できないのかなと
>>>> 考えています。
>>>> (※static にテーブル名など取得できるんでしたっけ??)
>>>> まだ dbflute の経験が短いので、浅い知識で申し訳ございません。
>>>>
>>>>> ・必要なシーケンス値を取得する外だしSQLを用意する。
>>>>> ・対象テーブルのexbhvに、シーケンスを取得するメソッドを用意
>>>>> する。
>>>>> ・対象テーブルのexbhvで、insertメソッドをオーバーライドし、
>>>>> 対象のカラムがNullならば、シーケンスを取得して設定をする処理
>>>>> を入れる。(bsbhvのinsertの中も忘れずに記述する)
>>>> こちらも参考にさせていただきます。今日の夜にでも試してみます。
>>>>
>>>>> テーブル名を渡して取得したい場合は、シーケンスを取得する
>>>>> Oracleのプロシージャを作成して、テーブル名を渡すようにした方
>>>>> が良いと思います。
>>>> 了解しました。
>>>> 私のほうでも試してみて、やはり無理ならプロシージャで考えて見ます。
>>>>
>>>>> 今回はあまり環境についての差異はありませんが、使用している
>>>>> バージョンによって仕様や動作が違ったりすることがありますので
>>>>> DBFluteとOracleのバージョンは明記した方がいいと思います。
>>>> 了解しました。今後は心がけます。
>>>> ちなみに、DBFluteは9.5.2で、OracleはExpressEdition(10g) です。
>>>>
>>>> 以上、よろしくお願いいたします。
>>>>
>>>> 2009/08/11 13:59 に 西山 はじめ<[E-MAIL ADDRESS DELETED]> さんは書きました:
>>>>> お世話になっております。
>>>>> 西山です。
>>>>>
>>>>> 解決していそうですが、横から失礼します。
>>>>> 見当違いの場合はスルーしてください。
>>>>>
>>>>> mokkouyouさんのおっしゃっている通り、現時点のDBFluteでは主
>>>>> キー以外のSequenceを特定のカラムと対応付ける機能は無いと思い
>>>>> ます。(調べた限りでは・・・ですが)
>>>>>
>>>>> hattiさんが行いたいことは、「insert時にシーケンスに対応して
>>>>> いるカラムの値を自動設定したい」だと思うのですが、この場合、
>>>>> 以下の方法で実現できると思います。
>>>>>
>>>>> ・必要なシーケンス値を取得する外だしSQLを用意する。
>>>>> ・対象テーブルのexbhvに、シーケンスを取得するメソッドを用意
>>>>> する。
>>>>> ・対象テーブルのexbhvで、insertメソッドをオーバーライドし、
>>>>> 対象のカラムがNullならば、シーケンスを取得して設定をする処理
>>>>> を入れる。(bsbhvのinsertの中も忘れずに記述する)
>>>>>
>>>>> シーケンスの値だけ取得したいのでしたら、シーケンス取得用のメ
>>>>> ソッドだけでいいと思います。
>>>>>
>>>>> Oracleではシーケンスとカラムの関連を設定できない為、DBFlute
>>>>> で、dfpropで設定された内容と、DBの定義を関連付けています。
>>>>> DBFluteでも最後には、「SELECT SEQUENCE_NAME.NEXTVAL FROM
>>>>> DUAL」 を呼んでいるだけです。
>>>>>
>>>>> テーブル名を渡して取得したい場合は、シーケンスを取得する
>>>>> Oracleのプロシージャを作成して、テーブル名を渡すようにした方
>>>>> が良いと思います。
>>>>>
>>>>> 普通の外だしSQLで、
>>>>> SELECT /*param*/SEQUENCE_NAME
>>>>> .NEXTVAL FROM DUAL
>>>>> は、試したことがありますがダメでした。
>>>>> (バインド変数を使っているからかもしれませんが・・・)
>>>>>
>>>>> あと、最後に1つだけですが、
>>>>>> もし質問方法が間違っていたらご指摘ください。
>>>>> 今回はあまり環境についての差異はありませんが、使用している
>>>>> バージョンによって仕様や動作が違ったりすることがありますので
>>>>> DBFluteとOracleのバージョンは明記した方がいいと思います。
>>>>>
>>>>>
>>>>> [2009/08/11 11:56] mokkouyou さんは書きました。:
>>>>>> mokkouyouです。
>>>>>>
>>>>>> jfluteさんが1週間程度お休みとのこと(http:
>>>>>> //d.hatena.ne.jp/jflute/20090806)ですので、
>>>>>> 的外れかもしれませんが、「私なら」ということで。
>>>>>>
>>>>>> 内部を軽く覗いて見ましたが、
>>>>>> sequenceDefinitionMap.dfpropではどうにもなりそうにありませんね。
>>>>>>
>>>>>> 別に、SQL本体を外だしSQLにしないでも、
>>>>>> ・exbhvなどに、シーケンスの値を取得するメソッドを用意する。
>>>>>> ・Entityの組み立て時に、明示的にシーケンスを取得して設定する。
>>>>>> としてもいいのではないでしょうか。
>>>>>>
>>>>>> シーケンスの取得に関して、
>>>>>> そこの部分はどうしますかねぇ。。。というところですが、
>>>>>>
>>>>>> SQL文を実行する方法ってありましたっけ?(生で実行以外に)
>>>>>>
>>>>>> ない場合、
>>>>>> オーソドックスに行くのであれば、
>>>>>> ・シーケンス取得SQLを外だしSQL
>>>>>>
>>>>>> はたまた、
>>>>>> ・PKで自動生成されるBsBhvの箇所を参考にして
>>>>>> dbflute-runtime/src/main/java/org/seasar/dbflute/bhv/AbstractBehaviorWritable.java
>>>>>> 辺りのメソッドと
>>>>>> SelectNextValCommandを利用して頑張ってみる。
>>>>>> とかでしょうか。
>>>>>>
>>>>>> SelectNextValCommandはDbMetaを利用しているので、
>>>>>> DbMetaの該当部分をオーバーライドしたサブクラスなどをを
>>>>>> 渡してあげればいけそうな気もしますね。バージョンアップに弱くなりそうですが。
>>>>>>
>>>>>> 以上宜しくお願いいたします。
>>>>>>
>>>>>> 2009/08/11 9:48 HATTI <[E-MAIL ADDRESS DELETED] <mailto:[E-MAIL ADDRESS DELETED]>>:
>>>>>>
>>>>>>     はじめまして hatti と申します。
>>>>>>     メーリングリストに投稿するのは初めてなもので、
>>>>>>     もし質問方法が間違っていたらご指摘ください。
>>>>>>
>>>>>>     現在 DBFlute + Oracle で、学習を進めているのですが、
>>>>>>     シーケンス(Sequence)についてわからない点がございます。
>>>>>>
>>>>>>     sequenceDefinitionMap.dfprop ファイルに、テーブルにひもづく
>>>>>>     Sequenceを1つ設定できるのはわかったのですが(主キー用など)、
>>>>>>     1テーブルに対して複数のSequenceを設定できないのでしょうか。
>>>>>>
>>>>>>     主キーだけでなく、その他のカラムにもシーケンス値を
>>>>>>     利用したい場合はどのように記述するのでしょうか。
>>>>>>     外だしSQLにしないと対応できないのでしょうか。
>>>>>>
>>>>>>     以上、よろしくお願いいたします。
>>>>>>     _______________________________________________
>>>>>>     Seasar-user mailing list
>>>>>>     [E-MAIL ADDRESS DELETED] <mailto:[E-MAIL ADDRESS DELETED]>
>>>>>>     https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> mokkouyou
>>>>>> [E-MAIL ADDRESS DELETED] <mailto:[E-MAIL ADDRESS DELETED]>
>>>>>>
>>>>>>
>>>>>> ------------------------------------------------------------------------
>>>>>>
>>>>>> _______________________________________________
>>>>>> Seasar-user mailing list
>>>>>> [E-MAIL ADDRESS DELETED]
>>>>>> https://ml.seasar.org/mailman/listinfo/seasar-user
>>>>>
>>>>> --
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>> 株式会社フジミック
>>>>> システム開発センター ソフトウェア開発部
>>>>> 西山 創
>>>>> [E-mail]:[E-MAIL ADDRESS DELETED]
>>>>>
>>>>> 〒140-0002 東京都品川区東品川3-32-42 フジテレビ別館7階
>>>>> [TEL]:03-5495-1060
>>>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>>>
>>>>> _______________________________________________
>>>>> 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
>>>>
>>>>
>>>
>>>
>>> --
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>> 株式会社フジミック
>>> システム開発センター ソフトウェア開発部
>>> 西山 創
>>> [E-mail]:[E-MAIL ADDRESS DELETED]
>>>
>>> 〒140-0002 東京都品川区東品川3-32-42 フジテレビ別館7階
>>> [TEL]:03-5495-1060
>>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>>
>>> _______________________________________________
>>> 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 メーリングリストの案内