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