无法找到persistence.xml文件

4
我尝试使用jpa与spring-orm和hibernate一起使用。我有一个名为TRADES的mysql数据库表,我想使用jpa来操作它。我尝试使用persistence.xml测试EntityManager的创建,但是我收到了一个异常:“没有名为[persistence-unit-name from persistence.xml]的EntityManager的持久性提供程序”。根据我在类似问题中观察到的情况,这意味着我的情况下找不到persistence.xml文件。当我尝试测试此配置时,我收到了一个异常,我认为是因为找不到persistence.xml。
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named trade-mysql-pu
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
    at com.madhusudhan.jsd.jpa.EntityManagerTest.init(EntityManagerTest.java:16)
    at com.madhusudhan.jsd.jpa.EntityManagerTest.main(EntityManagerTest.java:29)

我弄不清楚为什么会出现这种情况。您能帮助我吗? 谢谢。

表格:

create table TRADES (ID int NOT NULL, 
    ACCOUNT VARCHAR(20) NOT NULL, 
    SECURITY VARCHAR(10) NOT NULL, 
    QUANTITY INT NOT NULL, 
    STATUS VARCHAR(10), 
    DIRECTION VARCHAR(10)
);

这个表的实体类:

package com.madhusudhan.jsd.domain.jpa;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="trades")
public class Trade {

    private int id;
    private String direction;
    private String account;
    private String security;
    private String status;
    private int quantity;

    @Column(nullable=false)
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @Column
    public String getDirection() {
        return direction;
    }
    public void setDirection(String direction) {
        this.direction = direction;
    }

    @Column
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }

    @Column
    public String getSecurity() {
        return security;
    }
    public void setSecurity(String security) {
        this.security = security;
    }

    @Column
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }

    @Column
    public int getQuantity() {
        return quantity;
    }
    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    @Override
    public String toString() {
        return "Trade [id=" + id + ", direction=" + direction + ", account="
                + account + ", security=" + security + ", status=" + status
                + "]";
    }

}

在src/main/resources/META-INF中的persistence.xml文件

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
    version="2.0">

    <persistence-unit name="trade-mysql-pu" transaction-type="RESOURCE_LOCAL">
        <provider>org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter</provider>
        <class>com.madhusudhan.jsd.domain.jpa.Trade</class>
        <properties>
            <property name="hibernate.hbm2ddl.auto" value="validate" />
            <property name="show_sql" value="true" />
            <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/JSDATA"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="prospring4"/>
            <property name="hibernate.connection.password" value="prospring4"/>
            <property name="hibernate.connection.pool_size" value="1"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
        </properties>
    </persistence-unit>
</persistence>

这是测试类:

package com.madhusudhan.jsd.jpa;

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

import com.madhusudhan.jsd.domain.jpa.Trade;

public class EntityManagerTest {

    private EntityManagerFactory factory;
    private EntityManager entityManager;

    private void init() {
        factory = Persistence.createEntityManagerFactory("trade-mysql-pu");
        entityManager = factory.createEntityManager();
    }

    public void persistTrade(Trade t) {
        entityManager.persist(t);
    }

    public static void main(String[] args) {
        EntityManagerTest test = new EntityManagerTest();
        test.init();
    }
}

build.gradle中的依赖项:

dependencies {
    compile 'org.springframework:spring-context:4.1.6.RELEASE'
    compile 'org.springframework:spring-jdbc:4.1.6.RELEASE'
    compile 'org.springframework:spring-orm:4.1.6.RELEASE'
    compile 'commons-dbcp:commons-dbcp:1.4'
    compile 'mysql:mysql-connector-java:5.1.18'
    compile 'org.hibernate:hibernate-core:3.6.0.Final'
    compile 'org.hibernate:hibernate-entitymanager:3.6.0.Final'
    compile 'junit:junit:4.7'
    compile 'log4j:log4j:1.2.14'
}

你的构建布局是什么?persistence.xml在哪里? - Leos Literak
@LeosLiterak persistence.xml在src/main/resources/META-INF中,src/main/resources/在构建路径中没有任何排除。 - wazz
1个回答

4

以下是您可以尝试的几种方法:

  1. 检查您的src/main/resources文件夹是否在类路径中。在Eclipse中,这意味着右键单击项目>属性>Java Build Path,然后确保在Source选项卡下指定了src/main/resources。如果没有,请单击Add Folder添加资源文件夹。
  2. 如果上述方法不起作用,请尝试将您的persistence.xml移到src/main/java/META-INF文件夹中。
  3. 将persistence.xml中的provider更改为

    org.hibernate.ejb.HibernatePersistence


你好,Tony。感谢回复。但是我尝试将文件夹移动到src/main/java中,结果仍然相同。此外,我检查了在Eclipse中/java和/resources都在构建路径中,没有任何被排除的文件。 - wazz
持久化文件 persistence.xml 是否确实复制到目标 WEB-INF/classes 文件夹中?同时也请尝试我的第三个建议。 - Tony Vu
谢谢。这是一个独立的应用程序,我认为它不应该有WEB-INF。 - wazz
感谢您的帮助!这是一个独立的应用程序,我认为它不应该有WEB-INF。当使用HibernatePersistence类作为提供者而不是HibernateJpaVendorAdapter时,找到了persistence.xml文件。现在我收到了关于“传递给persist的已分离实体不一致”的消息,将尝试弄清楚为什么会发生这种情况。 - wazz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接