0

テクノロジー: EJB 3.1、JSF、JBoss 7.1.1

CRUDが機能するプロジェクトがあります。問題:

1 つのブラウザで、エンティティのリストを含むテーブルが開きます。他にもあります。各テーブルは最新です。1 つのエンティティが編集され、永続化されます。DB では、正しいデータ状態を確認できます。

別のブラウザでは、データを更新してリロードしますが、最後の変更はありません。画面には以前のデータが表示されます (データは最新ではありません)。ただし、ログイン/ログアウトすると、最後に編集されたデータが表示されます (データは最新です)。

その理由はJPA-キャッシングだと思います。

現在のセッション中に DB から実際のデータを取得する方法についてアドバイスが必要です。

Pesistense.xml

 <persistence-unit name="MyEntityManager">

        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <jta-data-source>java:jboss/datasources/MydataSource</jta-data-source>
        <properties>

            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.dialect"value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.transaction.manager_lookup_class"
                      value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
            <property name="hibernate.connection.autocommit" value="true"/>
            <property name="hibernate.connection.characterEncoding" value="utf8"/>

            <property name="hibernate.c3p0.min_size" value="5"/>
            <property name="hibernate.c3p0.max_size" value="20"/>
            <property name="hibernate.c3p0.timeout" value="1800"/>
            <property name="hibernate.c3p0.max_statements" value="50"/>

        </properties>

    </persistence-unit>

DAO クラス

@Named("userDao")
@Stateful
@TransactionManagement(TransactionManagementType.BEAN)
public class UserDaoBean implements UserDAO, Serializable {

    private static final long serialVersionUID = -2486674295685504650L;

    @PersistenceContext(name = "MyEntityManager", type = PersistenceContextType.EXTENDED)
    private EntityManager em;

   private User getUser(String user) {
        try {
            return (User) em.createNamedQuery(Queries.GET_User).setParameter("User", user.No).getSingleResult();
        } catch (NoResultException ex) {
            return null;
        }
    }

    @Override

    public void addUser(User user) throws Exception {
        em.persist(user);
        em.flush();
    }

    @Override
    public void update(User user) throws Exception {
        User tmpUser = getUser(user.getUser());
        if (tmpUser == null) {
            addUser(user);
            return;
        }
        tmpUser.setUser(user.getUser());
        tmpUser.setUsere(user.getUser());
        em.persist(tmpUser);
        em.flush();
    }

追加してみました

 userTransaction.begin();
  //removal or updating
  userTransaction.commit();

しかし、 em.flush();それは機能しません。

よろしくお願いします!

4

1 に答える 1

1

拡張永続コンテキスト ( type = PersistenceContextType.EXTENDED) を使用しています。これは、仕様がそれらについて述べていることです:

コンテナー管理の拡張永続コンテキストは、ステートフル セッション Bean のスコープ内でのみ開始できます。これは、タイプ PersistenceContextType.EXTENDED のエンティティ マネージャへの依存を宣言するステートフル セッション Bean が作成された時点から存在し、ステートフル セッション Bean にバインドされていると言われます。拡張永続コンテキストへの依存関係は、PersistenceContext アノテーションまたは persistence-context-ref デプロイメント記述子要素によって宣言されます。永続コンテキストは、ステートフル セッション Bean の @Remove メソッドが完了すると (またはステートフル セッション Bean インスタンスが破棄されると)、コンテナによって閉じられます。

したがって、この永続コンテキストの第 1 レベルのキャッシュは、ステートフル セッション Bean の存続期間中維持されます。この場合、拡張永続コンテキストを使用する理由はありません。ステートレス セッション Bean と通常の永続コンテキストを使用すると、ユーザーは永続コンテキストの第 1 レベルのキャッシュから再ロードされるのではなく、DB から再ロードされます。

于 2012-06-11T09:39:43.260 に答える