0

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からカスケードするものはありません。

4

1 に答える 1

1

多くの調査の結果、私はいくつかの結論に達し、行動を起こすことができました。最初に、Gileadフォーラムでかなりの検索を行った後、それがもはや積極的に維持されていないことを知りました。もっと早く気づいたはずです。その間、私はRequestFactoryについて読み始め、数日間の調査の結果、これに移行してみることにしました。

これはかなり大きなプロジェクトで、およそ50のドメインオブジェクトがあり、いくつかは多くのオブジェクトの関連付けがあります。Gilead + GWT RPCの使用からRequestFactoryの排他的使用まで、すべてを書き直すのに約40〜50時間かかりました。結果として生じるコードと構造の変更にはかなり満足しています。これまでのところ、DTOプロキシオブジェクトを作成する必要はあまりありません。この機会に、Hibernate Annotationsに切り替えて、マッピングファイルを削除しました。

RequestFactoryが必要とするフェッチ/編集/保存サイクルを利用するためにコードをリファクタリングするのは時々トリッキーでした。それは私にいくつかのコードを改善する機会を与えてくれました。

幸いなことに、問題は解決されました。不思議なことに削除される多対多の関連付けはもうありません。私の推測では、Gileadでバグが発生していたか、使用法が正しくなかったか、Annotationsに移行するときに問題が解決した可能性があります。

RequestFactory + Hibernateを学習しているときに、いくつかの優れたリソースに出くわしました。その多くはStackOverflowを介して行われました(ありがとうございます)。

ObjectifyでGWTRequestFactoryを使用する-RequestFactoryがバックエンドとどのように相互作用するか、およびコードを削減するためのいくつかのメソッドと定型文を理解するのに最適でした。

うまくいけば、以下のリンクがもっとあります。私はまだ初心者なので、投稿できるハイパーリンクの数に制限があります:)

私はたくさんのことを学び、RequestFactoryに堪能になりました。私は目を光らせて、私ができると思うところをここで助けるために最善を尽くします。

StackOverflowに感謝します!

于 2011-06-10T17:05:11.893 に答える