2013-02-25 52 views
1

在此環境中處理事務的最佳方式是什麼?使用JSF2,EJB3,JPA2的事務

我有一個Transacao類,它有一個Transacao集合。

public class Transacao { 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pai") 
    private List<Transacao> filhos; 
} 

我在JSF從EJB加載此,像:

public class TransacaoBean { 

    @EJB 
    private TransacaoService transacaoService; 

    private void edit(Long id) { 
     this.transacao = transacaoService.findById(id); 
    } 
} 

雖然,如果我想獲得FILHOS的收藏,我必須這樣做:

public class TransacaoBean { 

    ... 

    private void edit(Long id) { 
     this.transacao = transacaoService.findById(id); 
     log.info(this.transacao.getFilhos.size()); //this throws a LazyInitializationException 
    } 
} 

,我得到一個例外。

在我的JSF中加載這個文件的最佳方式是什麼?我正在考慮創建一個Filter並使用USerTransaction來保持該請求的事務處於打開狀態,或者在我的EJB中提取filhos。有沒有更好的解決方案,哪個更好?

回答

0

fetch@OneToMany的默認值是FetchType.LAZY

您可以將它設置爲FetchType.EAGER以在非託管環境中使用它們。

或者您可以製作另一個EJB或獲取列表的方法或者只是大小。

public class TransacaoService { 

    public Transacao findById(final long id) { 
     ... 
    } 

    public long getFilhosSize(final long id) { 
     // SELECT f FROM Transacao AS t WHERE t.pai.id=:id 
    } 

    @PersistenceContext 
    private EntityManager entityManager; 
}