2011年5月11日編集:
以下のものより少し悪いと思います。デプロイしたQAインスタンスで、メインダッシュボードを何度も更新すると、最終的にユーザーの多対多のグループの関連付けが削除されます。この時点では、サーバー側で呼び出されているのはselectステートメントのみです。うまくいけば、私はこれらの最新のテストでそれを絞り込んでいます。
オリジナル:
こんにちは、みんな。かなり複雑なオブジェクトに問題があります。問題は次のとおりです。保存するオブジェクトをクライアントからサーバーに送信すると、関連するオブジェクトの多対多の関係がランダムに消去されているように見えます。さらに悪いことに、問題を認識してから約2か月後、自分で問題を再現することはできません。QAグループでテストするためのアプリを用意しています。彼らは毎日プログラムを使用しており、新しいアプリケーションとレガシーアプリケーションを二重に入力しています。問題は1日に3回も発生します。
私はできる限り詳細を提供するために最善を尽くします、そして見てくれる人に大いに感謝します!
アプリのフレームワークは、GWT 2.1 + Gilead + Hibernate 3 +MySQLInnoDBです。Hibernateにカスケードなどを処理させているので、すべての外部キーがDBに設定されていますが、DBには何も定義されていません。
マッピングからの抜粋を次に示します。
<hibernate-mapping>
<class name="com.example.domain.Close" table="CLOSE">
<many-to-one name="updateUser"
class="com.example.domain.User"
column="LAST_UPDATE_USER"/>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.domain.User" table="USER" batch-size="25">
<set name="groups" table="USER_GROUP" lazy="true" batch-size="25">
<key column="USER_ID"/>
<many-to-many column="GROUP_ID" class="com.example.domain.Group"/>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.example.domain.Group"
table="GROUP" batch-size="25">
<set name="users" table="USER_GROUP" lazy="true" inverse="true">
<key column="GROUP_ID"/>
<many-to-many column="USER_ID" class="com.example.domain.User"/>
</set>
<set name="permissions" table="PERMISSION_GROUP" lazy="true" inverse="true">
<key column="GROUP_ID"/>
<many-to-many column="PERMISSION_ID"
class="com.example.domain.Permission"/>
</set>
<hibernate-mapping>
<class name="com.example.domain.Permission"
table="PERMISSION">
<set name="groups" table="PERMISSION_GROUP" lazy="true">
<key column="PERMISSION_ID"/>
<many-to-many column="GROUP_ID"
class="com.example.domain.Group"/>
</set>
</class>
</hibernate-mapping>
オブジェクトの保存は、saveOrUpdate()の呼び出しで簡単です。
Session session = gileadHibernateUtil.getSessionFactory()
.getCurrentSession();
session.beginTransaction();
try {
session.saveOrUpdate(close);
} catch (Exception e) {
e.printStackTrace();
session.getTransaction.rollback();
}
session.getTransaction.commit();
return close;
Close'updateUser'は、ユーザーがログインしたときに読み込まれるオブジェクトです。システムがアプリモジュールへのアクセスを許可/拒否できるように、関連するグループと権限が読み込まれます。そうです
close.setUpdateUser(exampleApp.getUser());
オブジェクトをサーバーに送り返す前。
この種の操作が行われるアプリには他にもたくさんの場所がありますが、望ましくない副作用は発生しません。それはおそらく、Closeオブジェクトに関連付けられたクライアント側のコードの複雑さ、またはむしろそれの私の実装に要約されます。
私は公式のHibernateドキュメントを調べたり、関連する可能性のある問題を探したりするのに多くの時間を費やしてきました。助けを求めるのに良い時期だと思いました。私は人を増やしてそれを維持しなければなりません、しかし多分ただ尋ねることは私がそれを理解するのを助けるでしょう。
現在、他に何を提供すればよいのかわかりません。うまくいけば、これまでのところここにあるものに関連性があります!
聞いてくれてありがとう!
編集
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: insert into example_dev.RECENT_ITEM (OBJECT_TYPE, OBJECT_ID, DATE, USER_ID) values (?, ?, ?, ?)
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.PERMISSION_GROUP where PERMISSION_ID=?
May 5 12:18:38 localhost last message repeated 19 times
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_GROUP where USER_ID=?
May 5 12:18:38 localhost jsvc.exec[10117]: Hibernate: delete from example_dev.USER_DESIGNATION where USER_ID=?
この挿入の直後に削除が行われているようです。以前の操作はすべて選択です。ただし、UserにはRecentItemからカスケードするものはありません。