Wildfly 中有多个持久性单元?

Posted

技术标签:

【中文标题】Wildfly 中有多个持久性单元?【英文标题】:Multiple persistence units in Wildfly? 【发布时间】:2016-05-17 11:24:53 【问题描述】:

Wildfly (9.0.2) 应用程序中是否可以有两个持久性单元?

我收到“WFLYJPA0061:未指定持久性单元名称,并且在应用程序部署部署“jasper-web.war”中有 2 个持久性单元定义。要么将应用程序部署更改为只有一个持久性单元定义,要么为每个持久性单元定义对持久性单元的引用。”

我在@PeristenceContext 注释中指定了unitName。我在可以禁用的地方阅读

<!--
<subsystem xmlns="urn:jboss:domain:jpa:1.1">
    <jpa default-datasource="" default-extended-persistence-inheritance="DEEP"/>
</subsystem>
-->

standalone.xml。这删除了错误消息,但也禁用了 entityManagers 的注入(在代码中引用它们的空指针)

我尝试将持久性单元拆分为两个不同的 ejb-jar,每个都有自己的 persistence.xml,但由于它们仍然包含在同一个战争中,Wildfly 仍然抱怨。

这两个持久化单元与hibernate一起使用,一个与postgresql数据库一起使用,一个与用于ms访问的ucanaccess驱动程序一起使用。他们都分开工作。

【问题讨论】:

是的,它确实有效。该错误表明存在没有unitNamespecified 的注入点。你确定你没有错过一个?如果您包含完整的错误,它可能会提供有关其位置的更多详细信息。 谢谢,我有一个没有 unitName 的潜伏。现在部署没有错误。 【参考方案1】:

这里是我们的 wildfly 8.x/9.x ejb 应用程序的示例:

首先在persistence.xml中定义每个持久化单元的所有类,可以关闭未列出的类来禁用自动发现。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
   <persistence-unit name="primary">
      <jta-data-source>java:jboss/datasources/primary_ds</jta-data-source>
      <class>whatever.primary.model.SomeEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>

   <persistence-unit name="secondary">
      <jta-data-source>java:jboss/datasources/secondary_ds</jta-data-source>
      <class>whatever.secondary.model.AnotherEntity</class>
      <exclude-unlisted-classes>true</exclude-unlisted-classes>
      <properties> ... </properties>
   </persistence-unit>
</persistence>

如果你使用 JBoss Developer Studio 忽略警告(它只是一个 eclipse 缺陷):

定义了多个持久性单元 - 只会识别第一个持久性单元

Resources.java

package whatever.util;

import javax.annotation.Resource;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

public class Resources 

    @Produces
    @PersistenceContext(unitName = "primary")
    private EntityManager emPrimary;

    @Produces
    @PersistenceContext(unitName = "secondary")
    private EntityManager emSecondary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/primary_ds")
    private DataSource dsPrimary;

    @Produces
    @Resource(lookup = "java:jboss/datasources/secondary_ds")
    private DataSource dsSecodnary;


道初例

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoPrimaryExample 

    @PersistenceContext(unitName = "primary")
    private EntityManager em;

    public void create(SomeEntity entity) 
        em.persist(entity);
    

道次例

package whatever.dao;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class DaoSecondaryExample 

    @PersistenceContext(unitName = "secondary")
    private EntityManager em;

    public void create(AnotherEntity entity) 
        em.persist(entity);
    

重要提示:如果您计划在同一事务中使用展位持久性单元,则应使用 XA 数据源。

【讨论】:

感谢您非常彻底的回答。它确实有效,是我有一个带有 @PersistenceContext 的会话 bean,而我忘记了潜伏的 unitName。【参考方案2】:

正如 John Ament 指出的那样,错误消息实际上表明没有 unitName 的注入点(我在源代码中忘记了这一点......)一旦我摆脱了它,一切都按原样工作。当我在 jboss AS 中发现一些旧问题时,我在谷歌上搜索这个问题也有点困惑,这实际上似乎是一个问题。

【讨论】:

【参考方案3】:

在persistence.xml 中为持久性单元添加此选项为我解决了这个问题:

<property name="wildfly.jpa.default-unit" value="true"/>

【讨论】:

谢谢,我相信这也有效。与此同时,我已经切换到 sprng boot 并遇到了一系列全新的挑战:)

以上是关于Wildfly 中有多个持久性单元?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Wildfly 21 上配置 Jakarta 持久性

Wildfly/JBOSS 持久性错误 MSC000001:无法启动服务 jboss.persistenceunit

多个 JPA 持久性单元指向同一个数据库?

persistence.xml 中的多个持久性单元相互创建表

通过wildfly将实体持久化到postgresql期间挂起的多线程事务

多线程事务在持久化实体中通过wildfly挂起到postgresql