1

Spring ROOアプリケーションをセットアップし、永続性をOpenJPAに設定し、いくつかのエンティティーを作成しました。次に、SpringMVCをApacheWicketに置き換えました。スタッフは正常に機能しているようで、顧客エンティティのリストを正常に表示しました。

次は、顧客の編集ビューでした。今のところ、フォームモデルとしてOpenJPAエンティティを直接使用するWicketフォームを作成したため、エンティティクラスにSerializableを実装する必要がありました。

さて、OpenJPAの永続性を正しく実装する方法がわかりません。今、私が得ているのは次のとおりです。

@Override
protected void onSubmit() {
    try {
        if (customer.getId()!=null) {
            customer.merge();
        }
        else {
            customer.persist();
        }
    }
    catch (Exception e) {
        throw new Error(e);
    }
    super.onSubmit();
}

これは機能しますが、Customerオブジェクトごとに1回だけです。何とかして。つまり、フォームを1回送信すると、新しい顧客(.persist())と既存の顧客(.merge())の両方で機能します。ただし、同じ顧客に対してフォームを再度送信すると、このエラーが発生します(ここにいくつかの改行を追加しました)。

<openjpa-2.0.0-r422266:935683 nonfatal store error>
org.apache.openjpa.persistence.OptimisticLockException:
An optimistic lock violation was detected when flushing object instance "no.magge.iumb.domain.crm.PrivateCustomer-379" to the data store.
This indicates that the object was concurrently modified in another transaction.

私の質問は、OpenJPAを維持する正しい方法は何ですか、そしてなぜそのエラーが発生するのですか?

Wicketに関して:取り外し可能なCustomerモデルを使用して別のWicket IModelを作成する必要がありますが、それがこれらの問題の原因である可能性がありますか?

アドバイスをたくさんありがとう!

4

1 に答える 1

2

自分に有利に働き、アプリケーション層を分離してください。ビュー内のコードはデータベースにアクセスしてはなりません。

サービスレイヤーやDaoレイヤーを作成し、それらのレイヤーのコードを単体テストして、それらが機能していることを確認してから、daoまたはサービスオブジェクトを改札コンポーネントに挿入します。(そのためにスプリングを使用することをお勧めしますが、手動で行うこともできます)

あなたのシナリオでは、1つの場所で失敗する可能性のあるさまざまなことがあり、それらを分離することはほぼ不可能です。

ここにいくつかのポインタがあります:

于 2010-10-12T13:52:57.313 に答える