[Seasar-user:6146] Re: 【KuinaDao】バッチ更新について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 2月 13日 (火) 22:00:52 JST


小林 (koichik) です.

Date:    Tue, 13 Feb 2007 19:47:43 +0900
From:    "T.N" <[E-MAIL ADDRESS DELETED]>
To:       [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:6144] 【KuinaDao】バッチ更新について

>         // 更新対象のDtItemsを検索
>         List<DtItem> dtItems = this.dtItemDao.findByParameter(dtItem);
> 
>         for (int i = 0; i < orderDtos.length; i++) {
>             // DtItemに更新後のサイズと数を設定し更新
>             dtItems.get(i).setSize(orderDtos[i].getSize());
>             dtItems.get(i).setNum(orderDtos[i].getNumber().longValue());
>             this.dtItemDao.merge(dtItems.get(i));

この merger() は不要です.

JPA の merge() メソッドは,永続コンテキストに
管理されていない,分離された (detached) 状態の
エンティティを,永続コンテキストに結びつけるために
使います.

上のコードでは,findByParameter() メソッドで取得した
エンティティは永続コンテキストに管理された (managed)
状態であるため,merge() の対象ではありません.

管理された (managed) 状態のエンティティは,プロパティを
変更するだけでトランザクションのコミット時に自動的に
(バッチ) 更新されます.

ただし,管理された (managed) エンティティを merge() に
渡しても無視されるだけで,影響はないはずなのでこの現象とは
関係ないような気もします.

> 2007-02-13 18:39:54,171 [http-8080-Processor24] ERROR
> org.hibernate.util.JDBCExceptionReporter - [ESSR0072]SQLで例外(SQL=
> [update DtItem set studentid=?, schoolid=?, size=?, num=? where id=?],
> ErrorCode=1062, SQLState=23000)が発生しました

実行された UPDATE 文には本来は主キーである studentid と
schoolid が含まれているので,これが原因でエラーが
発生しているのかもしれません.
もしそうだとすると,Hibernate Annotations 固有の
アノテーションを使って,

@Entity
@org.hibernate.annotations.Entity(dynamicUpdate = true)
public class DtItem {
  ・・・

とすれば回避できるかもしれませんが,バッチ更新の
効果は小さくなってしまう可能性があります.

ともあれ (JW),現状ですと複合主キーをやめるか,
Kuina-Dao を使うことをやめるかした方が無難では
ないかと思います.
お試し程度なら構わないのですが.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内