【问题标题】:JPA EntityManager ConstructionJPA EntityManager 构造
【发布时间】:2014-09-12 15:01:18
【问题描述】:

我正在尝试学习如何使用最佳实践来创建实体管理器。我正在创建一个使用 maven 拆分为单独项目的 JavaSE 应用程序,以便我可以使用不同的项目来创建具有不同功能的应用程序。

到目前为止,我已经创建了我的实体并使用 hibernate.cfg.xml 对其进行了测试。

现在我已经创建了我的persistence.xml,我正在尝试了解如何将我的EntityManagerFactory 连接到EntityManager,以及将其与我测试的Entities 一起使用的最佳方式。

根据我的阅读,我需要一个Service 层和一个ServiceImpl 层。我的问题更多是配置问题。目前我有一个项目com.myapp.entities。我正在考虑创建一个项目com.myapp.servicecom.myapp.serviceimpl。如果我理解正确,EnitityManagerFactoryEntityManager 的实例化应该进入com.myapp.serviceimpl,但我如何注入这些以与我的实体一起使用以及创建EntityManager 的最佳方法是什么?

还有,我的persistence.xml进入哪个项目?

【问题讨论】:

标签: java maven jpa


【解决方案1】:

目前我有一个项目com.myapp.entities。我正在考虑创建一个项目com.myapp.servicecom.myapp.serviceimpl

我不认为你想在同一个项目中创建不同的项目而是不同的

实体、服务和服务实现只要设计一致就有意义。因此,如果您将它们拆分为多个项目,那么维护您的代码将非常困难,甚至基于此 JPA 持久性模块部署您的应用程序也将非常困难,因为您将拥有多个依赖项。更不用说应用程序在生产环境中运行后的可维护性。

还要记住 JPA(实际上是持久性)是应用程序设计的底层。如果您想创建具有不同功能但基于相同持久性背景的应用程序,那么这些功能应该位于顶级业务逻辑层,而不是持久层。

另外,我的persistence.xml 进入哪个项目?

正如我所说,您实际上应该拥有一个项目而不是多个项目。但作为一般规则,persistence.xml 应该出现在您的实体所在的同一个项目中。

我正在尝试了解如何将我的 EntityManagerFactory 连接到 EntityManager 以及在我的测试中使用它的最佳方式 实体。

既然你说你正在开发一个 Java SE 应用程序,那么你必须照顾 EntityManagerFactoryEntityManager 的生命周期;

虽然您的 Service 可能看起来像这样:

public interface Service {

    public EntityManager getEntityManager();

}

实现可能如下所示:

public class ServiceImp implements Service {

    private EntityManagerFactory emf;
    private EntityManager em;

    public Service() {
        super();
        emf = Peristence.createEntityManagerFactory("YourPU");
    }

    @Override
    public EntityManager getEntityManager() {
        if (em == null || !em.isOpen()) {
            em = emf.createEntityManager();
        }
        return em;
    }
}

【讨论】:

  • 感谢您的所有回答!另一个问题。无论如何,我确实需要为不同的数据库模式和不同的功能创建不同的项目。这个想法是能够在一个应用程序中提供一些功能,而在另一个应用程序中提供所有功能。话虽这么说,我会为每个模式设置一个实体管理器,对吗?我还看到了一些使用@PersistenceContext 的示例。这是必要的还是可选的?
  • 实际上,每个模式都需要一个持久性单元。对于同一个持久性单元,您可能有多个实体管理器,它们都与相同的模式相关联。另一方面,@PersistenceContext 注释旨在与容器管理的持久性一起使用,并且是 JEE 标准的一部分。有必要吗?不,但强烈推荐,尤其是当您需要使用多个持久性单元时。容器将为您管理整个实体管理器的生命周期。
  • 这是一个非常广泛的话题,您可以使用很多框架/工具。如果您可以在不同的问题中更准确地定义您的需求,那么我(当然还有许多其他开发人员)会很高兴以正确的方式引导您。 @L.Young
  • 1) 拥有多个 EntityManager 并没有错。一个实体必须附加到一个实体管理器,这样它才能真正被管理。因此,假设您有一个由 EntityManager A 选择和管理的 Employee 实例,并且想要使用 EntityManager B 合并该实体,那么您将遇到问题,因为该实体附加到 A 而不是 B。但是避免这种情况是您所拥有的照顾你的代码。 @L.Young
  • 2) 你的选择对我来说很有意义。例如考虑EntityManagerFactory。它是EntityManager 对象的工厂。但是EntityManager其实是一个接口。你不知道,你实际上并不关心具体的实现。你知道它符合合同,这就是你需要知道的。 @L.Young
【解决方案2】:

Persistence.xml 应该放在 resources/META-INF 中。 然后您只需以这种方式在您的 serviceImpl 中调用实体管理器:

public class ServiceImpl {

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("YOUR_PU");
    EntityManager em = emf.createEntityManager();

    public void save(Entity ent) {
       em.persist(ent);
    } 
}

其中“YOUR_PU”是您的持久性单元名称。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2018-01-20
    • 2023-04-11
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多