1

フォームを表示して保存しようとしています。私はSpring + primefacesと休止状態を使用しています。

問題は、 URL をヒットしようとするとDRS/jsf/lodi/createLodi.xhtml、フォームを表示してエンティティを作成することを期待していることです。しかし実際には、最初に saveLodi() メソッドを呼び出してデータベースにレコードを作成するということが起こっています。

何がそうさせているのか、私にはわかりません。これが私の createLodi() メソッドです

@Transactional(readOnly=true)
public String newLodi() {
    lodi = new Lodi();

    return "/jsf/lodi/createLodi.xhtml";
}

ここに saveLodi() があります

/**
 * Save an existing Lodi entity
 * 
 */
@Transactional
public String saveLodi(Lodi lodi) {
    System.out.println("SAVELODI CALLED...........!");
    lodiService.saveLodi(lodi);
    return "/jsf/lodi/listLodis.xhtml";
}

そして、次のようなメニューバーコンポーネントのメニュー項目から呼び出しています

    <p:menuitem value="Enter and Update 807's" url="#{LodiComponent.newLodi()}" ajax="true"/>

それの何が問題なのですか?save が呼び出されるのはなぜですか? 誰でも私にアイデアを与えることができますか?

ありがとう、タヒール

4

1 に答える 1

1

これは、トランザクションの設定方法や使用しているフラッシュ モードに問題がある可能性が高いです。

問題は、createLodi メソッドと saveLodi メソッドの間で何が起こるかということです。そのエンティティに Hibernate 呼び出しを行うか、他の進行中のトランザクションがある場合、そこでクエリまたはコミットすると、flushmode.AUTO (デフォルト) に設定すると、flush() がトリガーされる可能性があります。

http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/FlushMode.html

クリーンな解決策は、createLody と saveLodi が 1 つのトランザクションになるようにトランザクションを設定することです。そのため、hibernate は、トランザクションがエラーや中止なしで終了した場合にのみ、エンティティが DB に保存されるように処理します。また、これにより、必要な方法でトランザクションを正確に設定できます。

于 2013-05-14T08:51:45.677 に答える