[Seasar-user:11482] Re: [Kuina-Dao] dao.persist(entity) で,主キー重複エラーを回避するには?
Applied_MATSUDA Masaaki
[E-MAIL ADDRESS DELETED]
2007年 11月 6日 (火) 15:33:53 JST
TigerCatです.
小林さん,おいそがしいところ丁寧にご返答いただき
ありがとうございます.
>> なるほど,persist()でupdateはできない・・・と.
>> 教示していただいたelse以下がupdateの場合の対応となると思う
>> のですが,
>>
>> > } else {
>> > fuga.setXXX(Boolean.TRUE);
>> > fuga.setYYY(yyy);
>> > }
>>
>> セットするだけで,あとは何もしなくて良いということです
>> よね?!
>
>はい.
うまくいきました!
ありがとうございます.
>> ということは・・・
>> こちらももっと真面目なサンプルを提示しなければならなかった
>> かもしれません・・・
>
>その前に JPA についてきちんと学習した方がよいかと.
>Kuina-Dao は EntityManager に対する操作を簡素化しますが,
>JPA を隠蔽するものではありません.
ふがっ.
ですよね・・・
おっしゃるとおり.
しかし,正直いって「サクサク」に釣られてしまったからには
例えば,JavaExpert #1 の
JPA特集 → フムフム・・・ォェェェ,もうええわぁ〜.
Kuina-Dao特集 → コレダ!こんだけ書けば動くんだぁ〜.
と,アホになり切ってユートピアに首をつっこんだところで
あります.(爆
ほんと,申し訳ない.
本を買いますので,ア,[BS][BS][BS]買った本は隅々まで
読むように心がけますので,お許しくださいませ.
ちなみに #2も買いました.(汗
>> ・DBのネイティブロックをかける汎用的な仕掛は??
>
>JPA の標準的なやり方は EntityManager#lock() を
>使うことです.
>Kuina-Dao でも Dao に readLock()/writeLock() を
>持たせることができます.
># GenericDao を拡張していればデフォルトで使えます.
ああ,コレですね.
でもこれっていわゆるエンティティロック(?)です
よね.
>public void insertOrUpdate(String code) {
> Header header = headerDao.find(code);
> if (header == null) {
> header = new Header();
> header.setCode(code);
> dao.persist(header);
> Detail detail = new Detail(code, 1);
> detail.setHeader(header);
> header.addDetail(detail);
> detailDao.persist(detail);
> } else {
> headerDao.readLock(header); // ★
> int version = detailDao.getMaxVersion(code);
> Detail detail = new Detail(code, version + 1);
> detail.setHeader(header);
> header.addDetail(detail);
> detailDao.persist(detail);
> }
>}
>関連にカスケードの設定をしていればもう少し
>スッキリとしますが,概ねこんな感じではないかと.
うわ.
わざわざコードを書いていただきまして・・・
もったいない幸せです.
ぁぅ〜 OTZ
しかも,要件を全うしているなんて・・・
>テーブルをロックする方法は JPA にはないので,
>別のエンティティを使って同じように排他制御する,
>ネイティブ SQL でテーブルロックする,
>前回書いたように requiresNew なトランザクションで
>例外を拾ってリトライする等々,適切な方法を検討
>してください.
うむぅ,テーブルロック,有ってもよさそうなのに
ねぇぇ(泣
でも,使っているDBを判断してネイティブSQLでその
DBの方言でロックかけさせるクラスを作ればいいんだ
なぁ.
jdbc.diconから,現在使用中のDBって分からんでも
ないですからね・・・
>> ・(↑あきらめて)insertOrUpdateでトランザクション
>> を自分で制御するには??
>
>http://s2container.seasar.org/2.4/ja/tx.html
ありがとうございます!
・・・Container側を探すべきだったのですな orz
>> ・select count(*) や,select max(version) をサックリ
>> 実現する方法は??
>
>http://kuina.seasar.org/ja/user_guide/query.html#SQLによる検索
やはり,JPQLやSQLを書くしかないわけですな.
できればSQLレスで,という目標を掲げてはみたものの,
結局はor検索で早速SQL書かねばならないので,まぁ,
SQLレスというのは早々にあきらめるべきですよね.
ではでは!
Seasar-user メーリングリストの案内