技术: EJB 3.1,JSF,JBoss 7.1.1
有一个工作CRUD的项目。 问题:
在一个浏览器中,打开包含实体列表的表。 在另一个也是。每张表都是最新的。 编辑并保留一个实体。在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 -class
@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();
但它确实无法运作。
提前感谢!
答案 0 :(得分:1)
您正在使用扩展持久化上下文(type = PersistenceContextType.EXTENDED
)。这就是规范中关于它们的说法:
只能启动容器管理的扩展持久性上下文 在有状态会话bean的范围内。它存在于这一点上 在哪个有状态会话bean声明依赖于 创建了PersistenceContextType.EXTENDED类型的实体管理器,并且 据说绑定到有状态会话bean。依赖于 扩展的持久化上下文是通过 PersistenceContext批注或持久性 - context-ref部署 描述符元素。持久性上下文由容器关闭 当有状态会话bean的@Remove方法完成时(或者 否则会破坏有状态会话bean实例。
因此,此持久化上下文的第一级缓存在有状态会话Bean的生命周期内保持活动状态。在这种情况下,我认为没有理由使用扩展的持久化上下文。使用无状态会话bean和普通的持久化上下文,用户将从数据库重新加载,而不是从持久化上下文的第一级缓存重新加载。