1

この環境でトランザクションを処理するための最良の方法は何ですか?

Transacaoのコレクションを持つTransacaoクラスがあります。

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

これをEJBからJSFにロードします。次のようになります。

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でfilhoをフェッチすることを検討しています。これに対するより良い解決策はありますか、どちらがより良いですか?

4

1 に答える 1

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;
}
于 2013-02-26T12:50:59.833 に答える