【问题标题】:JPA + Hibernate = No Persistence provider for EntityManagerJPA + Hibernate = EntityManager 没有持久性提供程序
【发布时间】:2014-12-15 15:04:09
【问题描述】:

我正在尝试为我的 Maven 项目设置 JPA,使用 Hibernate 作为提供程序。

项目结构

├── META-INF
│    └── persistence.xml
├── src
|   ├── main
|   |   └── java
|   |       ├── model
|   |       |   └── Instance.java
|   |       └── App.java
|   └── test
|       └── java
|           └── model
|               └── AppTest.java
└── pom.xml

persistence.xml 的内容

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="testjpa" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>it.vitrociset.model.Instance</class>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/aquasystem"/>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
            <property name="hibernate.connection.username" value="username"/>
            <property name="hibernate.connection.password" value="password"/>
        </properties>
    </persistence-unit>
</persistence>

Instance.java 的内容

package model;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Instance {

    @Id
    private String id;
    private String path;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

}

App.java 的内容

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class App {
    public static void main( String[] args ) {
        EntityManagerFactory entityManagerFactory =  Persistence.createEntityManagerFactory("testjpa");
        EntityManager em = entityManagerFactory.createEntityManager();
        EntityTransaction userTransaction = em.getTransaction();
        userTransaction.begin();
        Instance instance = new Instance();
        instance.setId("id");
        instance.setPath("path");
        em.persist(instance);
        userTransaction.commit();
        em.close();
        entityManagerFactory.close();
    }
}

pom.xml 的内容

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId></groupId>
    <artifactId></artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.6.Final</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.0-api</artifactId>
            <version>1.0.1.Final</version>
        </dependency>

    </dependencies>

</project>

我遇到了以下异常:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named testjpa

但我不知道为什么。我的代码有什么问题?我找不到解决方案。

【问题讨论】:

    标签: java hibernate maven jpa


    【解决方案1】:

    我在使用 hibernate 5 时遇到了这个问题。切换到 4.3.11。Final 修复它。 org.hibernate.ejb.HibernatePersistence 不在类路径中。

    【讨论】:

    • 在 persistence.xml 中尝试使用 org.hibernate.jpa.HibernatePersistenceProvider 作为 Hibernate 5 的提供者,而不是使用 Hibernate 4 的 org.hibernate.ejb.HibernatePersistene
    【解决方案2】:

    将 hibernate-entitymanager.jar 添加到类路径以解决此问题。

    【讨论】:

    • 当我尝试向后移植到 Java 1.7 时,这解决了我的问题。现在不推荐使用,而是使用 hibernate-core。但是,没有这个休眠就无法找到我的持久性提供者.... ????
    【解决方案3】:

    Persistence.xml 不在资源目录中,因此不在类路径中。将 META-INF 目录移动到 src/main/resources。

    【讨论】:

    • 我认为你的意思是 src/main/resources
    • 我的 META-INF 在 src/main/webapps 中。如果我把它移到resources,它会告诉我Unable to locate persistence units。看来这是进步了。
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2016-11-04
    • 2012-06-21
    • 2019-01-16
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多