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

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


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