数据库中的数据不是最新的(EJB3.1,HibernatePersistence)

数据库中的数据不是最新的(EJB3.1,HibernatePersistence),hibernate,jpa,transactions,ejb,jta,Hibernate,Jpa,Transactions,Ejb,Jta,技术: EJB 3.1、JSF、JBoss 7.1.1 这是一个有工作积垢的项目。 问题: 在一个浏览器中,将打开包含图元列表的表。 在另一个国家也是如此。每张表都是最新的。 一个实体被编辑并保存。在DB中,我们可以看到正确的数据状态 在另一个浏览器中,我们进行刷新和重新加载数据,但没有最后的更改。 屏幕上显示以前的数据(数据不是最新的)。 但在登录/注销后,我们可以看到最后编辑的数据(数据是最新的) 我认为原因是JPA缓存 我需要一个如何在当前会话期间从数据库中获取实际数据的建议 Pesist

技术: EJB 3.1、JSF、JBoss 7.1.1

这是一个有工作积垢的项目。 问题:

在一个浏览器中,将打开包含图元列表的表。 在另一个国家也是如此。每张表都是最新的。 一个实体被编辑并保存。在DB中,我们可以看到正确的数据状态

在另一个浏览器中,我们进行刷新和重新加载数据,但没有最后的更改。 屏幕上显示以前的数据(数据不是最新的)。 但在登录/注销后,我们可以看到最后编辑的数据(数据是最新的)

我认为原因是JPA缓存

我需要一个如何在当前会话期间从数据库中获取实际数据的建议

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>
我试着多加一些

 userTransaction.begin();
  //removal or updating
  userTransaction.commit();
em.flush()但它不起作用


提前谢谢

您正在使用扩展的持久性上下文(
type=PersistenceContextType.extended
)。这是规范对它们的描述:

只能启动容器管理的扩展持久性上下文 在有状态会话bean的范围内。它是从这个角度存在的 其中声明对 创建PersistenceContextType.EXTENDED类型的实体管理器,并且 被称为绑定到有状态会话bean。依赖 扩展持久性上下文是通过 PersistenceContext注释或持久性上下文引用部署 描述符元素。容器关闭了持久性上下文 当有状态会话bean的@Remove方法完成时(或 有状态会话bean实例将被销毁)


因此,此持久性上下文的第一级缓存在有状态会话bean的生命周期内保持活动状态。我认为没有理由在这种情况下使用扩展持久性上下文。使用无状态会话bean和正常的持久性上下文,用户将从数据库中重新加载,而不是从持久性上下文的一级缓存中重新加载。

在stackoverflow中说“谢谢”就是将答案标记为正确答案。
 userTransaction.begin();
  //removal or updating
  userTransaction.commit();