2013-02-25 2 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, чтобы сохранить транзакцию открытой для запроса или выбрать filhos в моем EJB. Есть ли лучшее решение для этого, какой из них лучше?

ответ

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; 
} 
Смежные вопросы