web-dev-qa-db-ja.com

永続性.xmlが存在するのに永続性ユニットの名前がnullになるのはなぜですか

Wildfly 8.1をエンティティを含むEJBプロジェクト(EJB 3.2)と一緒に使用しています。エンティティマネージャを私のBeanの1つに注入しようとすると、次のようになります。

_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();
    }
}
_

「project-name」/ ejbModule/META-INFに配置した次の_persistence.xml_ファイルを指定しました。

_<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>
_

同様の質問とその解決策

更新(コメントを参照):
-_@EntityManager_の代わりに@EntityManager(unitName="mitarbeiter")を使用しようとしました-上記のSessionBeanは、EntityManagerを挿入しようとする唯一の場所です。

アップデート2(回答のコメントを参照):

  • _persistence.xml_はディレクトリ_Project/ejbModule/META-INF/_にあります
  • このディレクトリはビルドパスに含まれています
  • 同じディレクトリ内の他のファイルが(_jar/META-INF/_に)展開されているのに、どういうわけか展開されていません。手動でコピーして貼り付けると、機能します。何故ですか?

どんな助けやヒントも大歓迎です。

11
Jbartmann

考えられる問題のいくつか:

  • persistence.xmlファイルの場所が正しくありません。アーカイブのルートにあるMETA-INF/ディレクトリ内に配置してください。 Mavenを使用する場合は、src/main/resources/META-INF/persistence.xmlになります。
  • 無効なpersistence.xmlファイル:行persistence-unit<persistence-unit name="mitarbeiter"/>タグが閉じられています(最後に/があることに注意してください)
  • <property-name="hibernate.hbm2ddl.auto" value="create-drop"/>は無効です。私はあなたが望んでいたと思います:<property name="hibernate.hbm2ddl.auto" value="create-drop" />
  • また、使用しているプロバイダーは非推奨です。

一般に、あなたの場合のJPA2.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>
8
G. Demecki