Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee JPA中的可选持久性单元(当使用多个持久性单元时)_Jakarta Ee_Jpa_Java Ee 6_Jndi_Persistence Unit - Fatal编程技术网

Jakarta ee JPA中的可选持久性单元(当使用多个持久性单元时)

Jakarta ee JPA中的可选持久性单元(当使用多个持久性单元时),jakarta-ee,jpa,java-ee-6,jndi,persistence-unit,Jakarta Ee,Jpa,Java Ee 6,Jndi,Persistence Unit,JPA是否支持可选的持久性单元?如果支持,我如何配置 我有一个持久化单元,它是我的主数据库 然后我配置了另一个数据库,我只是从数据库中读取对象来进行一些检查。为了避免在多个数据源上处理事务,我将第二个数据源jta设置为false 但我希望能够检查是否定义了第二个数据源,并且仅在存在的情况下使用它。如果没有定义,我只想跳过我的检查 问题是我找不到如何使这个选项可选。如果未配置第二个数据源,则在部署war时,Jboss中的部署扫描程序会出现新的缺少/未满足依赖项错误: service jboss.n

JPA是否支持可选的持久性单元?如果支持,我如何配置

我有一个持久化单元,它是我的主数据库

然后我配置了另一个数据库,我只是从数据库中读取对象来进行一些检查。为了避免在多个数据源上处理事务,我将第二个数据源jta设置为false

但我希望能够检查是否定义了第二个数据源,并且仅在存在的情况下使用它。如果没有定义,我只想跳过我的检查

问题是我找不到如何使这个选项可选。如果未配置第二个数据源,则在部署war时,Jboss中的部署扫描程序会出现新的缺少/未满足依赖项错误:

service jboss.naming.context.java.secondDatasource (missing) dependents: [service jboss.persistenceunit."de.my.war#secondDatasource"] 
顺便说一句:我正在使用JBoss7.1.0,并在standard.xml中配置了数据源——如果这些信息有任何相关性的话


有什么提示吗?

我不确定XML配置是否可行,因为XML配置基本上是在大多数情况下如何使用JPA的约定。尝试寻找一种编程方法

也许您可以通过编程方式将数据源作为JNDI资源查找,如果找到了一个,您可以自己查找。在它的帮助下,甚至可能没有你想象的那么困难

@Produces
@MyAlterNativeEntityManager
public EntityManager getEntityManager {
    EntityManager entityManager = null;
    if(jndiLookupMySecondDatasource()){
       entityManager = buildEntityManagerProgrammatically(...);
    }
    return entityManager;
}
当然,如果找不到数据源,将返回一个空的EntityManager,但在调用代码中,您可以简单地检查它是否已初始化,并仅在它已初始化时使用。
希望这能帮助您走上正确的道路。

我不确定XML配置是否可行,因为XML配置基本上是在大多数情况下应该如何使用JPA的约定。尝试寻找一种编程方法

也许您可以通过编程方式将数据源作为JNDI资源查找,如果找到了一个,您可以自己查找。在它的帮助下,甚至可能没有你想象的那么困难

@Produces
@MyAlterNativeEntityManager
public EntityManager getEntityManager {
    EntityManager entityManager = null;
    if(jndiLookupMySecondDatasource()){
       entityManager = buildEntityManagerProgrammatically(...);
    }
    return entityManager;
}
当然,如果找不到数据源,将返回一个空的EntityManager,但在调用代码中,您可以简单地检查它是否已初始化,并仅在它已初始化时使用。 希望这能帮助你走上正确的道路。

在JPA标准中:

每个EntityManagerFactory EMF必须与一个PersistentUnit PU相关-不可能有多个PersistenceUnits或零PersistenceUnits。 每个EntityManager EM实例都是从EMF创建的,因此也有一个PU。当然,我们可以从一个EMF创建多个EMs,所有这些都使用相同的PU。 可以使用硬编码配置针对每个EMF显式使用哪个PU

EntityManagerFactory emf=Persistence.createEntityManagerFactoryEmployeeService

或者通过使用注释注入EMF

@PersistenceUnitEmployeeService 实体管理工厂emf

或者可以将其留空,只选择persistence.xml中配置的默认PU

可以通过使用注释注入EM来配置显式针对每个EM使用哪个PU。这里的代码根本不引用EMF,让容器以不可见的方式引用EMF

@PersistenceContextunitName=EmployeeService 实体管理器

在所有这些情况下,可选脓液的想法没有任何意义。如果您使用的是JPA EMs,则必须提交给PU

选项:

编辑persistence.xml,使相同的逻辑持久性单元在两个不同的物理数据库实例之间切换。不满足全部要求-仍将从替代数据源读取值。 根据Balazs Maria Nemeth的解决方案,查找/注入环境变量debug or not,并以编程方式在不同的数据源之间切换。无法满足全部要求,因为它仍将从替代数据源读取值。 查找/插入环境变量debug或not,并适当地运行/排除备选EM的代码。 3是满足全部要求的唯一选项。例如:

// Inject environment setting. Resource annotation works with/without CDI -  
// just doesn't give scoping support, which isn't required here.
@Resource boolean debugMode;

if (debugMode) {
    @PersistenceContext(unitName="DebugPersistenceUnit")
    EntityManager debugEM;

    Employee emp = debugEM.find(Employee.class, empId);
}
然后在web.xml或ejb.xml中包含一个env条目:

<env-entry>
    <description>
     Only set this true in a debugging environment
    </description>
    <env-entry-name>debugMode</env-entry-name>
    <env-entry-type>java.lang.Boolean</env-entry-type>
    <env-entry-value>true</env-entry-value>
</env-entry>
在JPA标准中:

每个EntityManagerFactory EMF必须与一个PersistentUnit PU相关-不可能有多个PersistenceUnits或零PersistenceUnits。 每个EntityManager EM实例都是从EMF创建的,因此也有一个PU。当然,我们可以从一个EMF创建多个EMs,所有这些都使用相同的PU。 可以使用硬编码配置针对每个EMF显式使用哪个PU

EntityManagerFactory emf=Persistence.createEntityManagerFactoryEmployeeService

或者通过使用注释注入EMF

@PersistenceUnitEmployeeService 实体管理工厂emf

或者可以将其留空,只选择persistence.xml中配置的默认PU

可以通过使用注释注入EM来配置显式针对每个EM使用哪个PU。这里的代码根本不引用EMF,让容器以不可见的方式引用EMF

@PersistenceContextunitName=EmployeeService 实体管理器

在所有这一切中,这个想法 这种选择性的脓液没有任何意义。如果您使用的是JPA EMs,则必须提交给PU

选项:

编辑persistence.xml,使相同的逻辑持久性单元在两个不同的物理数据库实例之间切换。不满足全部要求-仍将从替代数据源读取值。 根据Balazs Maria Nemeth的解决方案,查找/注入环境变量debug or not,并以编程方式在不同的数据源之间切换。无法满足全部要求,因为它仍将从替代数据源读取值。 查找/插入环境变量debug或not,并适当地运行/排除备选EM的代码。 3是满足全部要求的唯一选项。例如:

// Inject environment setting. Resource annotation works with/without CDI -  
// just doesn't give scoping support, which isn't required here.
@Resource boolean debugMode;

if (debugMode) {
    @PersistenceContext(unitName="DebugPersistenceUnit")
    EntityManager debugEM;

    Employee emp = debugEM.find(Employee.class, empId);
}
然后在web.xml或ejb.xml中包含一个env条目:

<env-entry>
    <description>
     Only set this true in a debugging environment
    </description>
    <env-entry-name>debugMode</env-entry-name>
    <env-entry-type>java.lang.Boolean</env-entry-type>
    <env-entry-value>true</env-entry-value>
</env-entry>

谢谢你的主意。我认为在处理persistence.xml时,这种情况已经发生了。但是我会检查这个…当然,但是这样你甚至不必在persistence.xml中声明第二个数据源@巴尔扎斯·马里亚·奈米特:很抱歉我迟迟没有回答这个问题。如果通过JNDI找到数据源,我尝试了您自己构建EntityManager的解决方案。但是:我不知道如何在我自己创建的EntityManager resp上设置找到的数据源。实体管理工厂。它只接受属性来创建一个。但我手头有一个数据源。我曾想过自己映射所有必要的属性,但在数据源上找不到密码。有没有办法让创建的EntityManager使用我的数据源?我不这么认为。正如Glen Best的另一个答案也提到的,EMF必须与一个PU相关,因此您不能替换它的数据源,并且创建一个没有数据源的PU是没有意义的。如果有数据源,则创建EMF,如果没有,则无法创建。这个答案对你有用吗?或者我可能误解了这个问题。我想我可以为第二个数据源创建第二个EntityManagerFactory。这是第二个PersistenceUnit。如果我在persistence.xml文件中定义它,所有这些都已经可以工作了。唯一的问题是,当我在Jboss上的standalone.xml文件中没有定义第二个数据源时,我遇到了异常。按照你的想法,我想我可以将第二个EntityManagerFactory的创建转移到运行时,这样我就可以避免启动时出现异常。谢谢你的想法。我认为在处理persistence.xml时,这种情况已经发生了。但是我会检查这个…当然,但是这样你甚至不必在persistence.xml中声明第二个数据源@巴尔扎斯·马里亚·奈米特:很抱歉我迟迟没有回答这个问题。如果通过JNDI找到数据源,我尝试了您自己构建EntityManager的解决方案。但是:我不知道如何在我自己创建的EntityManager resp上设置找到的数据源。实体管理工厂。它只接受属性来创建一个。但我手头有一个数据源。我曾想过自己映射所有必要的属性,但在数据源上找不到密码。有没有办法让创建的EntityManager使用我的数据源?我不这么认为。正如Glen Best的另一个答案也提到的,EMF必须与一个PU相关,因此您不能替换它的数据源,并且创建一个没有数据源的PU是没有意义的。如果有数据源,则创建EMF,如果没有,则无法创建。这个答案对你有用吗?或者我可能误解了这个问题。我想我可以为第二个数据源创建第二个EntityManagerFactory。这是第二个PersistenceUnit。如果我在persistence.xml文件中定义它,所有这些都已经可以工作了。唯一的问题是,当我在Jboss上的standalone.xml文件中没有定义第二个数据源时,我遇到了异常。按照您的想法,我想我可以将第二个EntityManagerFactory的创建转移到运行时,这样就可以避免启动时出现异常。