2012-06-11 42 views
0

技術: EJB 3.1,JSF的JBoss 7.1.1的數據是不是最新的(EJB 3.1,HibernatePersistence)

沒有與工作CRUD項目。 問題:

在一個瀏覽器中,打開具有實體列表的表。 另一個也是。每張表都是最新的。 一個實體被編輯並保留。在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> 

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();但doen't工作。

提前致謝!

回答

1

您正在使用擴展持久性上下文(type = PersistenceContextType.EXTENDED)。這就是規範說對他們:

容器管理的擴展持久化上下文只能有狀態會話bean的範圍內開始 。它從 開始存在,其中創建了聲明對 類型爲PersistenceContextType.EXTENDED的實體管理器的依賴關係的有狀態會話bean,並且 被說成綁定到有狀態會話bean。通過 PersistenceContext註釋或持久性上下文引用部署 描述符元素聲明對 的依賴關係。當有狀態會話Bean的@Remove方法完成時(或以其他方式銷燬有狀態會話bean實例),容器 將關閉持久性上下文。

因此,此持久化上下文的第一級緩存在有狀態會話bean的生命週期內保持活動狀態。在這種情況下,我沒有理由使用擴展持久性上下文。使用無狀態會話bean和普通持久化上下文,用戶將從數據庫重新加載,而不是從持久化上下文的第一級緩存重新加載。

+0

其工作:) 非常感謝! – Olga

+2

在stackoverflow中表示感謝將答案標記爲正確的答案。 – JMelnik