0

オブジェクトIDを提供するデータベースにコミットせずに、session.saveOrUpdateを使用して永続化する休止状態のオブジェクトがあります。オブジェクト ID をインターフェイスに渡しています。これは、後で送信時にオブジェクトを再構築するために使用されます。フォームを送信すると、オブジェクトが技術的にデータベースに存在しないため、オブジェクトを取得するためのセッション クエリを実行できなくなりました。

そのオブジェクトを取得する方法を知っている人はいますか? 新しいオブジェクトを作成しただけでは、データベース ID が制御不能に増加します。何かご意見は?

質問の編集と明確化。

フォームが送信され、エラーが含まれている場合、エラーをキャッチして、エラーのあるページをリロードする必要があります。私が抱えていた問題は、コレクション内の永続化されていないデータを失っていることです。私の解決策は、すべての子オブジェクトを含む現在のオブジェクトを一時的にユーザー セッションに永続化し、ページがリロードされたら、永続化されたオブジェクトをメイン オブジェクトにコピーして、すべてのユーザーの以前のデータを返すことでした。ただし、ロールのコレクションを遅延して初期化することに失敗しました。これが、session.update などのトランザクションに頼った理由です。これでこの問題は解決しましたが、実際にデータベースに保存する前に、検証エラーが発生する前に、新しく作成されたオブジェクトに ID が付与されていました。

コードサンプル

@Property
private PurchaseRequest pr;

@Persist
private PurchaseRequest prPersist;   

Class<?> onActivate(Long prId) {
    if(request.isXHR()) {
        return null;
    }

    PurchaseRequest purchaseRequest = null;

    if(prPersist != null) {           
        session.update(prPersist);
        purchaseRequest = prPersist;
        prPersist = null;
    } else {
        purchaseRequest = (PurchaseRequest) session.createCriteria(PurchaseRequest.class)
            .add(Restrictions.idEq(prId))
            .uniqueResult();
    }

    this.pr = purchaseRequest;
}

検証方法

void onValidateFromPR() throws Exception {
    if (form.getHasErrors()) {
        prPersist = this.pr;
        return Page.Index;
    }
}
4

2 に答える 2

1

saveOrUpdateオブジェクトをデータベースにまだ保存したくない場合は、オブジェクトに ID を割り当てる必要はありません。フォームが送信され、オブジェクトに含まれるデータが有効な場合にのみ保存してください。

于 2012-05-23T15:14:12.670 に答える
0

問題は、オブジェクトが現在の DB トランザクションに保存されることです。これは、別のトランザクション (またはセッション) からはまだ見えないものです。

そのオブジェクトは、現在のトランザクションがコミットされるまで、別のトランザクションには存在しません。アイソレーション レベルと一緒にプレイできますが、お勧めしません。

トランザクションの最後に永続化し、detach reattachパターンを使用します。または、完全に完了していないオブジェクトを保存する部分保存を行います。何らかの方法でフラグを立てることができます。

もう 1 つの方法は、そのようなオブジェクトのメモリ内ストレージを使用することです。

呼び出すたびに、saveOrUpdateまたはオブジェクトを永続化するメソッドを Hibernate に最終的に保存する意思があることを伝えるため、ID が生成されることは正当です。

于 2012-05-23T15:20:12.157 に答える