当persistence.xml存在时,为啥持久性单元命名为null

Posted

技术标签:

【中文标题】当persistence.xml存在时,为啥持久性单元命名为null【英文标题】:Why is persistence unit named null when persistence.xml exists当persistence.xml存在时,为什么持久性单元命名为null 【发布时间】:2016-01-17 22:07:26 【问题描述】:

我将 Wildfly 8.1 与包含实体的 EJB 项目 (EJB 3.2) 一起使用。当尝试将实体管理器注入我的一个 Bean 时,我得到以下信息:

JBAS011440: Can't find a persistence unit named null in deployment \"EntitiesProject.jar\"",
"JBAS014771: Services with missing/unavailable dependencies" => [
    "jboss.deployment.unit.\"EntitiesProject.jar\".weld.weldClassIntrospector is missing [jboss.deployment.unit.\"EntitiesProject.jar\".beanmanager]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.HandleDelegate is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.InstanceName is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.InAppClientContainer is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.Validator is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.ORB is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]",
    "jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO.ValidatorFactory is missing [jboss.naming.context.java.comp.EntitiesProject.EntitiesProject.MitarbeiterDAO]"
]

这是我尝试注入 EntityManager 的 SessionBean:

@Stateless
public class MitarbeiterDAO implements MitarbeiterDAORemote 

    @PersistenceContext
    private EntityManager em;

    public int writeMitarbeiterToDB(Mitarbeiter m)
    
        em.persist(m);
        return m.getId();
    

我已经指定了以下persistence.xml 文件,我将其放入“项目名称”/ejbModule/META-INF。

<persistence-unit name="mitarbeiter">
   <provider>org.hibernate.ejb.HibernatePersistence</provider>
      <jta-data-source>java:jboss/datasources/mysqlDS</jta-data-source>
   <properties>
      <property-name="hibernate.hbm2ddl.auto" value="create-drop"/>
   </properties>
</persistence-unit>

类似问题及其解决方案

Can't find persistence unit 建议包含一个 persistence.xml Injecting entityManager in Wildfly / Jboss 指出我的 persistence.xml 可能存在另一个目录。我尝试了该目录,但仍然收到相同的错误消息。 Cannot find persistence unit from persistence.xml 虽然这不是完全相同的问题,但解决方案是将&lt;provider&gt; 添加到 persistence.xml,但这对我也不起作用

更新(见 cmets): - 我尝试改用@EntityManager(unitName="mitarbeiter") 只是@EntityManager - 上面显示的 Session Bean 是我尝试注入的唯一地方 EntityManager

更新 2(见答案的 cmets):

persistence.xml 在目录Project/ejbModule/META-INF/ 中 此目录包含在构建路径中 不知何故,它没有被部署,而同一目录中的其他文件正在部署(到jar/META-INF/)。如果我手动复制并粘贴它,它可以工作。这是为什么呢?

非常感谢任何帮助和提示。

【问题讨论】:

您是否尝试过在 @PersistenceContext 注释上指定 unitName 可选属性? 是的,我尝试过使用@PersistenceContext(unitName="mitarbeiter") 而不仅仅是@PersistenceContext 好的,正在检查。除非有多个持久性单元,否则不需要它。 persistence.xml 需要位于 JAR 文件中的目录 META-INF 中。是这样吗? 我刚刚发现它不是,但它应该是。它是该目录中唯一没有部署到 jar/META-INF 的文件 【参考方案1】:

几个可能的问题:

persistence.xml 文件的位置不正确。请将其放在存档根目录的META-INF/ 目录中。如果您使用 maven,它将是 src/main/resources/META-INF/persistence.xml。 无效的persistence.xml 文件:您在&lt;persistence-unit name="mitarbeiter"/&gt; 行中关闭了persistence-unit 标签(请注意末尾的/&lt;property-name="hibernate.hbm2ddl.auto" value="create-drop"/&gt; 无效。我想你想要:&lt;property name="hibernate.hbm2ddl.auto" value="create-drop" /&gt; 您正在使用的提供程序也已弃用。

一般来说,在您的情况下,JPA 2.1 的正确 persistence.xml 内容应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
  version="2.1">

  <persistence-unit name="mitarbeiter">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>java:jboss/datasources/MySqlDS</jta-data-source>

    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop" />
    </properties>
  </persistence-unit>
</persistence>

【讨论】:

谢谢你,这对我帮助很大!在寻找了几个小时的解决方案后,我再也没有看到这样的事情了!它让我更接近解决方案:据我所知,persistence.xml 位于正确的目录中:Projektname/ejbModule/META-INF 但它没有得到部署,而该目录中的其他任何东西都是。如果我手动复制并粘贴它,它可以工作。那会是什么? @Jbartmann 可能该目录未添加为构建类路径中的源位置 我在做的是:右键项目->构建路径->配置构建路径->Java构建路径->源码。有一个项目Project/ejbModuleIncluded: All。我将其更改为Included: selected all Folders, including META-INF。仍然没有部署我的 persistence.xml。那是你说的吗?我仍然只能通过手动复制和粘贴来运行它。一旦我在服务器上单击鼠标右键-> 清理它就会被删除。 @Jbartmann 我可以看到您只使用 Eclipse。所以请配置你的Deployment Assembly(项目->右键->属性->部署程序集)。并在/META-INF 部署路径下添加例如META-INF 目录。但请记住,使用 Gradle 或 Maven 时,您会更便携/独立于 IDE。 @Jbartmann 如果回答了您的原始问题,您可以考虑接受答案;)【参考方案2】:

我已经研究这个问题好几个星期了。我在托管服务器环境 MassiveGrid 上使用 Wildfly 20、AdoptOpenJDK 14、Maven 和 MySql。最终对我有用的是我在 JBoss 上找到的一个帖子,它解决了我的问题。我的测试环境是 Windows 10,没有修复它运行良好。解决方案是在 Web Pages/META-INF 命名服务下添加一个文件夹,并放置一个名为 java.sql.Driver 的文件,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<!--
  ~ JBoss, Home of Professional Open Source.
  ~ Copyright 2010, Red Hat, Inc., and individual contributors
  ~ as indicated by the @author tags. See the copyright.txt file in the
  ~ distribution for a full listing of individual contributors.
  ~
  ~ This is free software; you can redistribute it and/or modify it
  ~ under the terms of the GNU Lesser General Public License as
  ~ published by the Free Software Foundation; either version 2.1 of
  ~ the License, or (at your option) any later version.
  ~
  ~ This software is distributed in the hope that it will be useful,
  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  ~ Lesser General Public License for more details.
  ~
  ~ You should have received a copy of the GNU Lesser General Public
  ~ License along with this software; if not, write to the Free
  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  -->

<module xmlns="urn:jboss:module:1.0" name="com.mysql">
  <resources>
    <resource-root path="mysql-connector-java-8.0.18.jar"/>
  </resources>
  <dependencies>
    <module name="javax.api"/>
  </dependencies>
</module>

【讨论】:

以上是关于当persistence.xml存在时,为啥持久性单元命名为null的主要内容,如果未能解决你的问题,请参考以下文章

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

创建没有 persistence.xml 配置文件的 JPA EntityManager

找不到元素“持久性”的声明

我的 persistence.xml 文件中的 SAX 解析器错误

JPA 使用替代“persistence.xml”

persistence.xml文件的妙处