2013-08-19 31 views
1

我需要你的幫助EJB,JPA,JSF爲什麼不能得到一個新的bean查看

  1. 我有一個ManagedBean

    @ManagedBean 
    @SessionScoped 
    public class ComponentController implements Serializable { 
    private static final long serialVersionUID = 373631006594351707L; 
    @EJB 
    IComponentService componentService; 
    @EJB 
    IDocumentService documentService; 
    private Component component; 
    private DocumentEntity document; 
    
    
    
    public String createAndClose() { 
        componentService.save(component); 
        FacesMessage msg = new FacesMessage("Component added.", null); 
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        component = new Component(); 
        return "components"; 
    } 
    
    public String saveAndClose() { 
        componentService.update(component); 
        FacesMessage msg = new FacesMessage("Component updated.", null); 
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        component = new Component(); 
        return "components"; 
    } 
    
    public String createView() { 
        component = new Component(); 
        return "create"; 
    } 
    
    } 
    
  2. 我有這樣

    泛型DAO服務
    public abstract class GenericJpaService<T extends BaseEntity, ID extends Serializable> implements IGenericService<T, ID> { 
    
        @PersistenceContext 
        EntityManager em; 
        private Class<T> persistentClass; 
    
        public GenericJpaService() { 
        } 
    
        public GenericJpaService(Class<T> persistentClass) { 
         this.persistentClass = persistentClass; 
        } 
    
        public Class<T> getPersistentClass() { 
         return persistentClass; 
        } 
    
        public void setPersistentClass(Class<T> persistentClass) { 
         this.persistentClass = persistentClass; 
        } 
    
        @Override 
        public T save(T entity) { 
         this.em.persist(entity); 
         this.em.flush(); 
         this.em.refresh(entity); 
         Logger.getLogger(GenericJpaService.class.getName()).log(Level.INFO, "Object {0} saved to DB", entity); 
         return entity; 
        } 
    
        @Override 
        @SuppressWarnings("unchecked") 
        public T update(T entity) { 
         Logger.getLogger(GenericJpaService.class.getName()).log(Level.INFO, "Object {0} updated in DB", entity); 
         return (T) this.em.merge(entity); 
        } 
    ... 
    } 
    
  3. 所以,當我運行應用程序第一次我點擊一些鏈接添加組件。它執行:

公共字符串CreateView的()

  1. 我添加有一些數據+上傳一些文件等...
  2. 然後我點擊保存並關閉按鈕。它執行:

公共字符串createAndClose()

  1. 成功是我的數據保存到數據庫中。

這是一個問題,當我再次做它顯示我以前保存的數據。我調試它,但我不明白它在哪裏設置。之後

公共字符串CreateView的()

它768,16採取新的組件()對JSF頁面。 那麼,我犯了一個錯誤?我還是不明白?也許我應該使用Hibernate而不是普通的JPA?我之前使用它(Hibernate),因此更容易(使用HibernateUtil)。

PS。對不起,「新的組件()」的多個實例,但我試圖把它無處不在...

回答

0

最大的缺陷是,你使用的會話範圍,但實例變量,明確是爲單視圖。

使用@ViewScoped或查看是否可以重寫代碼,以便使用@RequestScoped。

一個小的其他提示;當保存時不需要刷新和刷新。這已經自動發生了。刷新也不更新給定的實體,但返回一個新的。只是調用em.refresh在這裏沒有意義。

+0

好的,我將它改爲ViewScoped。然後從ManagedBean更改爲Named。有用。我的場景工作正常。現在問題是不同的,但我會把下面的描述。 – Tomek

+0

@toldi請注意,視圖作用域在JSF 2.1及以下版本中與Named組合不起作用。您現在可能正在使用請求範圍。 –

+0

我昨天找到了。
我讀過這個,它幫助我不再延遲:
http://germanescobar.net/2010/04/4-areas-of-possible-confusion-in-jee6。html/
非常感謝@MikeBraun – Tomek

相關問題