【问题标题】:Transaction using JSF2, EJB3, JPA2使用 JSF2、EJB3、JPA2 的事务
【发布时间】:2023-04-11 03:35:02
【问题描述】:

在这种环境中处理事务的最佳方式是什么?

我有一个 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 中获取文件。有没有更好的解决方案,哪个更好?

【问题讨论】:

    标签: jpa jsf-2 ejb


    【解决方案1】:

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 2011-04-05
      • 2012-03-29
      相关资源
      最近更新 更多