質問

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

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

今、私はOpenJPAの永続性を正しく実装する方法がわかりません、私が今持っているのはこれです:

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

それは機能しますが、顧客オブジェクトごとに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で持続する正しい方法は何ですか、なぜ私はそのエラーを受けているのですか?

ウィケットごとに、取り外し可能な顧客モデルを備えた別のウィケットimodelを作成する必要がありますか?それがこれらの問題を抱えている理由かもしれませんか?

どんなアドバイスをしてくれてありがとう!

役に立ちましたか?

解決

自分に好意を与え、アプリケーションレイヤーを分離してください。ビュー内のコードは、データベースにアクセスしないでください。

サービスレイヤーおよび /またはDAOレイヤーを作成し、それらのレイヤーのコードをユニットテストして、それらが機能していることを確認し、DAOまたはサービスオブジェクトをウィケットコンポーネントに挿入します。 (そのためにSpringを使用することをお勧めしますが、手動で行うこともできます)

あなたのシナリオでは、1つの場所で失敗する可能性のある非常に多くの異なるものがあり、それらを分離することはほとんど不可能です。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top