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

西山 はじめ [E-MAIL ADDRESS DELETED]
2009年 8月 11日 (火) 16:18:30 JST


西山です。

> シーケンス名などを外から文字列などで渡すと、
> シーケンス名(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 メーリングリストの案内