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

HATTI [E-MAIL ADDRESS DELETED]
2009年 8月 11日 (火) 14:37:07 JST


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 メーリングリストの案内