上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

役に立ったらぽちっとよろしく。 人気ブログランキングへ

昔、見た映画での台詞にこんなのがあった。悪者のボスが、部下に後何分かかる?と聞いて、10分…と答えたのに対し「5分でできるはずだよ…~君」と切り返す。かっくよすぎ…。

事プログラミングに関しても、新しいライブラリやらフレームワークの機能を全て調べなくても、過去の経験からこの位は出来るはず…と予測できる事はとても重要だと思う。けどもその予測が外れる時もある。そういう場合、おいらのような自己中野郎は、自分の予測が外れた原因も考えず、その製品に対してブログで文句を書く…なんて嫌な奴なんだ…!

毎度前フリが長いが、ここからが本題。実はOracleのToplink + MySqlで当然できると思っていたら実はできなくてはまった…という話…。Toplinkを始めとするJPA製品には設定した方針(GenerationType)で連番を自動生成してくれる嬉しい機能がある。そしてMySqlにもAUTO_INCREMENTなる機能がある。なのでToplink側からこのAUTO_INCREMENTを使って連番をふる場合、先程のGenerationTypeとしてIDENTITYを指定する。で、おいらは、この連番機能によって生成されたキーを永続化直後のオブジェクトのプロパティから取得しようとした。

…が取得できない…。最初はToplinkのバグだと思った。けどもToplinkのサイトを見ると…

There is a difference between using IDENTITY and other id generation strategies: the identifier will not be accessible until after the insert has occurred–it is the action of inserting that caused the identifier generation. Due to the fact that insertion of entities is most often deferred until the commit time, the identifier would not be available until after the transaction has been committed.

英語が苦手なので正確には分からないけども…たぶんコミットするまでは生成した連番を取得出来ないって事らしい…。SQLの実行をコミットまで遅延させてパフォーマンスをって機能の副作用のようだ…でも、せめて連番を取得しようとしたら、取り合えずINSERTまでは実行するとか…せめてEntityManagerのflushの時点では取得出来るようにするとかできるはずだよOracle君!

特にひっかかるのはIDENTITYの場合だけ!って事!MySqlやMSSqlServer等の他のデータベース製品と違い、OracleはAUTO_INCREMENT的な機能でなく、SEQUENCEなる機能を使ってGenerationTypeもSEQUENCEを使う…。つまり、Oracleのデータベースを使う場合は、IDENTITYは必要ないわけで…多少陰謀めいたものを感じるのは、やはりおいらが性悪だからか…。ま、今度Hibernateの動作を調べてみるとしよう。

スポンサーサイト

役に立ったらぽちっとよろしく。 人気ブログランキングへ

コメント
この記事へのコメント
コメントを投稿する

トラックバック
この記事のトラックバックURL
この記事へのトラックバック
Copyright © ふらふら技術者の日記 All Rights Reserved.
Powered by FC2 Blog
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。