【问题标题】:Passing EntityManager object to all BusinessLayer methods将 EntityManager 对象传递给所有 BusinessLayer 方法
【发布时间】:2015-01-25 23:05:34
【问题描述】:

我想知道将 EntityManager 对象的引用传递给我的所有 BusinessLayer 方法是否是反模式。

public void setCost(EntityManager em, int idProduct);

public void updateProduct(EntityManager em, ProductEntity product);

我发现这种模式很实用,因为它让我可以管理多个方法的分组来构建个性化事务...

public void initProduct(EntityManager em, ProductEntity product) {
    ...
    tx.begin()
    ...
    setCost(em, idProduct);
    updateProduct(em, product);
    ...
    tx.commit(); 
}

PS:

  • 我没有使用 Spring 框架。
  • 基于 JPA 的业务层和数据访问层旨在 在桌面应用中使用。

谢谢

【问题讨论】:

  • 我唯一能看到这有任何用途的情况是,如果您不时需要不同的 entityManager,例如使用不同的数据源。

标签: java jpa transactions entitymanager


【解决方案1】:

将它作为参数传递似乎是不必要的努力,因为您可以通过@PersistenceContext 更轻松地注入它。

或者,如果您没有依赖注入容器,您可能希望以其他方式转移责任。不要将 EntityManager 作为参数传递,而是让实现从某个地方(例如 JNDI)获取它。

【讨论】:

  • @PersistenceContext 注释是否在“非 Web”应用程序(即:桌面应用程序)中完成这项工作?我没有使用 Spring 框架。
  • 不是真的没有。您需要一些依赖注入框架来为您处理它(CDI、Spring、Guice)。但它使界面更干净。如果在某个时候您决定不再使用 EntityManager 怎么办?您必须更改所有实现,或在其中传递“null”。
  • 在这种情况下,我可能会决定不再使用 EntityManager?
  • 也许您决定要编写纯 JDBC。也许您决定从 Web 服务接收实际数据。谁知道呢,但是那个参数将接口耦合到 JPA。这可能不是一个大问题,但仍然值得考虑。
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2011-09-27
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多