Java 没有名为的EntityManager的持久性提供程序

Java 没有名为的EntityManager的持久性提供程序,java,jpa,persistence,toplink,Java,Jpa,Persistence,Toplink,我使用TopLink在META-INF目录下使用同名的persistence.xml。 然后,我用以下代码调用它: EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb"); 但是,我收到了以下错误消息: 2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb jav

我使用
TopLink
META-INF
目录下使用同名的
persistence.xml
。 然后,我用以下代码调用它:

EntityManagerFactory emfdb = Persistence.createEntityManagerFactory("agisdb");
但是,我收到了以下错误消息:

2009-07-21 09:22:41,018 [main] ERROR - No Persistence provider for EntityManager named agisdb javax.persistence.PersistenceException: No Persistence provider for EntityManager named agisdb at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) 它应该在类路径中。但是,我得到了上面的错误。

之后,定义持久性提供程序名称:

<provider>org.hibernate.ejb.HibernatePersistence</provider>
org.hibernate.ejb.HibernatePersistence

确保
persistence.xml
文件位于目录中:
/WEB-INF/classes/META-INF
也许您定义了一个提供程序,如
org.hibernate.ejb.HibernatePersistence
,但在jar中引用了另一个。我就是这样:我的persistence.xml提供程序是openjpa,但我在类路径中使用了eclipselink。
希望这有帮助

角落案例:如果您使用的是m2Eclipse,它会自动在您的资源文件夹中放入excludes。然后,当您尝试在eclipse内部运行测试时,随后缺少persistence.xml将产生此错误。

当实体管理器试图指向多个持久性单元时,就会发生此错误。执行以下步骤:

  • 在编辑器中打开相关文件(前提是项目已在IDE中关闭)
  • 删除所有与持久性和实体管理器相关的代码
  • 保存文件
  • 在IDE中打开项目
  • 现在绑定您选择的数据库或表
  • “hibernate entitymanager.jar”
    放在应用程序的类路径中。
    对于较新的版本,您应该使用
    “hibernate core.jar”
    而不是不推荐的
    hibernate entitymanager

    如果您正在运行某些IDE,如Eclipse:
    项目属性->Java构建路径->库。


    否则,请将其放入应用程序的
    /lib

    问题已经得到了回答,但我只是想发布一条阻碍我的提示。此异常是在以前的错误之后引发的。我得到了这个:

    property toplink.platform.class.name is deprecated, property toplink.target-database should be used instead.
    
    尽管我已更改persistence.xml以包含新的属性名称:

    <property name="toplink.target-database" value="oracle.toplink.platform.database.oracle.Oracle10Platform"/>
    
    
    
    在关于不推荐使用的属性名称的消息之后,我得到了与上面相同的PersistenceException和一个完整的其他异常字符串。我的建议:确保检查异常的开头


    Glassfish v2.1.1中似乎存在一个bug,其中重新部署或取消部署和部署不会更新persistence.xml,而persistence.xml正在缓存到某个地方。我必须重新启动服务器,然后它才能工作。

    还有一点:如果您在Eclipse RCP环境中遇到这个问题,您可能必须将工厂生成从
    Persistence.createEntityManagerFactory
    更改为
    new PersistenceProvider().createEntityManagerFactory


    有关此问题的详细讨论,请参阅。

    确保已在“src”文件夹下创建persistence.xml文件。我是在项目文件夹下创建的,这就是我的问题。

    在OSGi上下文中,有必要在bundle的MANIFEST.MF中列出持久性单元,例如

    JPA-PersistenceUnits: my-persistence-unit
    
    否则,JPA包将不知道您的包包含持久性单元


    请参阅。

    在类路径中需要以下jar文件:

  • antlr-2.7.6.jar
  • commons-collections-3.1.jar
  • dom4j-1.6.1.jar
  • hibernate-commons-annotations-4.0.1.Final.jar
  • hibernate-core-4.0.1.Final.jar
  • hibernate-entitymanager.jar
  • hibernate-jpa-2.0-api-1.0.0.Final.jar
  • javassist-3.9.0.jar
  • jboss-logging-3.1.1.GA.jar
  • jta-1.1.jar
  • slf4j-api-1.5.8.jar
  • xxx-jdbc-driver.jar

  • 如果您正在使用Eclipse,请确保排除模式不会从构建路径上的源文件夹中删除您的
    persistence.xml

  • 转到属性->Java构建路径->源选项卡
  • 检查位于
    MyProject/src/main/java->Excluded:

    树节点的排除模式
  • (可选)通过选择节点并单击左侧的编辑按钮,将其设置为
    Excluded:(None)

  • 我在pom.xml文件中需要这个:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.6.Final</version>
    </dependency>
    
    
    org.hibernate
    休眠实体管理器
    4.2.6.最终版本
    
    快速建议:

    • 检查persistence.xml是否在类路径中
    • 检查hibernate提供程序是否在类路径中
    在独立应用程序(JavaEE之外)中使用JPA时,需要在某个地方指定持久性提供程序。据我所知,这可以通过两种方式实现:

    • 将provider元素添加到持久化单元:
      org.hibernate.ejb.HibernatePersistence
      (如Chris在正确的Ansare中所述:)
    • 必须将接口javax.persistence.spi.PersistenceProvider指定为服务,请参见此处:(在类路径中包含hibernate或其他JPA实现时,通常会包含此选项

    在我的例子中,我发现由于maven的错误配置,hibernate entitymanager jar没有作为依赖项包括在内,即使它是其他模块的暂时依赖项。

    我也面临同样的问题,但仍然存在

    我通过添加另一个jar文件解决了我的问题,该文件必须是(javax.persistence_2.1.0.v201304241213.jar.jar

    所需罐子:
    -javax.persistence_2.1.0.v201304241213.jar
    -eclipselink.jar
    -jdbc.jar(取决于使用的数据库)。


    我希望这有帮助。

    我也有这个错误,但问题是
    persistence.xml
    中的名称空间uri

    我替换了
    http://xmlns.jcp.org/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence
    和版本2.1到2.0


    它现在正在工作。

    您需要在类路径中添加hibernate-entitymanager-x.jar

    在Hibernate4.x中,如果jar存在
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.6.Final</version>
    </dependency>
    
    <?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="sample">
    
        <class>org.pramod.data.object.UserDetail</class>
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/hibernate_project"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="root"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="false"/>
    
            <property name="hibernate.cache.use_second_level_cache" value="false"/>
    
            <property name="hibernate.archive.autodetection" value="true"/>
        </properties>
    </persistence-unit>
    
    package org.pramod.data.object;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "user_detail")
    public class UserDetail {
        @Id
        @Column(name="user_id")
        private int id;
        @Column(name="user_name")
        private String userName;
    
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }   
        @Override
        public String toString() {
           return "UserDetail [id=" + id + ", userName=" + userName + "]";
        }
    }
    
    package org.pramod.hibernate;
    
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.Persistence;
    import org.pramod.data.object.UserDetail;
    
    public class HibernateTest {
        private static EntityManagerFactory entityManagerFactory;
    
        public static void main(String[] args)  {
            UserDetail user = new UserDetail();
            user.setId(1);
            user.setUserName("Pramod Sharma");
    
            try {
                entityManagerFactory = Persistence.createEntityManagerFactory("sample");
                EntityManager entityManager = entityManagerFactory.createEntityManager();
                entityManager.getTransaction().begin();
                entityManager.persist( user );
                entityManager.getTransaction().commit();
                System.out.println("successfull");
                entityManager.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    }
    
    UserDetail [id=1, userName=Pramod Sharma]
    Hibernate: drop table if exists user_details
    Hibernate: create table user_details (user_id integer not null, user_name varchar(255), primary key (user_id))
    Hibernate: insert into user_details (user_name, user_id) values (?, ?)
    successfull
    
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    
    No Persistence provider for EntityManager named mick
    
    // https://mvnrepository.com/artifact/org.hibernate/hibernate-core
    compile('org.hibernate:hibernate-core:5.3.1.Final')
    
    // https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api
    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.3.0'
    
    // Used for HsqlDB - add the hibernate-core jar to build.gradle too
    requires java.persistence;
    
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    
    src/main/resources/META-INF/persistence.xml
    
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    
    <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="mick" transaction-type="RESOURCE_LOCAL">
        <description>
            Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
        </description>
    
        <!-- Provided in latest release of hibernate
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        -->
    
        <class>com.micks.scenebuilderdemo.database.Parent</class>
        <class>com.micks.scenebuilderdemo.database.Child</class>
    
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbc.JDBCDriver"/>
    
            <property name="javax.persistence.jdbc.url"
                      value="jdbc:hsqldb:file:./database/database;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>
    
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
    
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
        </properties>
    
    </persistence-unit>
    
    </persistence>
    
    <dependency>
      <groupId>org.eclipse.persistence</groupId>
      <artifactId>eclipselink</artifactId>
      <version>2.5.0</version>
    </dependency>
    
    <persistence-unit name="com.myapp.model.jpa"
        transaction-type="RESOURCE_LOCAL">    
    public static final String PERSISTENCE_UNIT_NAME = "com.myapp.model.jpa";
    Persistence.createEntityManagerFactory(**PERSISTENCE_UNIT_NAME**);
    
    <property name="javax.persistence.jdbc.url" value="...”/>
    <property name="javax.persistence.jdbc.password" value="...”/>
    
    mvn install -e  -Dmaven.repo.local=$WORKSPACE/.repository.
    
    @Throws(HibernateException::class)
    fun getSessionFactory() : SessionFactory {
        return Configuration()
                    .configure(getFile())
                    .buildSessionFactory()
        }
    
    
    private fun getFile(canonicalName: String): File {
        val absolutePathCurrentModule = System.getProperty("user.dir")
        val pathFromProjectRoot = absolutePathCurrentModule.dropLastWhile { it != '/' }
        val absolutePathFromProjectRoot = "${pathFromProjectRoot}module-name/src/main/resources/$canonicalName"
        println("Absolute Path of secret-hibernate.cfg.xml: $absolutePathFromProjectRoot")
        return File(absolutePathFromProjectRoot)
    }