0

技术:EJB 3.1、JSF、JBoss 7.1.1

有一个工作 CRUD 的项目。问题:

在一个浏览器中,带有实体列表的表格被打开。在另一个也是。每个表都是最新的。一个实体被编辑并保留。在 DB 中,我们可以看到正确的数据状态。

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

我认为原因是 JPA - 缓存。

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

持久性.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 实例被销毁)时,容器将关闭持久性上下文。

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

于 2012-06-11T09:39:43.260 回答