【问题标题】:PersistenceException: Unable to build entity manager factory Caused by ClassNotFoundPersistenceException:无法建立由 ClassNotFound 引起的实体管理器工厂
【发布时间】:2017-07-20 09:51:23
【问题描述】:

我正在使用 play jpa 并遇到了这个。搜索完整的 Stackoverflow 找不到解决方案。

我想要的是当 localhost:9000 被命中时,HomeController 应该在 mysql 中已经创建的 db "crud" 中添加一个表 'Product'。这样就完成了我的第一个 jpa 计划

这是我的 Persistence.xml

<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="test" transaction-type="RESOURCE_LOCAL">


<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <non-jta-data-source>DefaultDS</non-jta-data-source>
    <class>models.Product</class>
    <properties>
        <property name="javax.persistence.jdbc.url" 
value="jdbc:mysql://localhost:3306/crud"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" 
value="toor"/>
        <property name="javax.persistence.jdbc.driver" 
value="com.mysql.jdbc.Driver"/>

    </properties>

</persistence-unit>
</persistence>

这是我的 application.conf

play.modules.enabled += "play.filters.csrf.CSRFModule"


play.filters.csrf {

  token {
    name = "csrfToken"
    sign = true
  }

  cookie {
    name = null
    secure = ${play.http.session.secure}
    httpOnly = false
  }

  body.bufferSize = ${play.http.parser.maxMemoryBuffer}
  bypassCorsTrustedOrigins = true

  header {
    name = "Csrf-Token"
    protectHeaders {
      Cookie = "*"
      Authorization = "*"
    }
    bypassHeaders {}
  }

  method {
    whiteList = ["GET", "HEAD", "OPTIONS"]
    blackList = []
  }

  contentType {
    whiteList = []
    blackList = []
  }

  errorHandler = null
}

play.crypto.secret="VRZV/ppo<t?;NKZN?
=PE<N;Yie_G^:sxQrL544YEl[fRsrE<:hMbT;Yj<WhG`bS@"


db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost:3306/crud"
db.default.user=root
db.default.pass=toor
db.default.jndiName=DefaultDS
jpa.default = test

这是堆栈跟踪

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[PersistenceException: Unable to build entity manager factory]]
    at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:255)
    at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:182)
    at play.core.server.AkkaHttpServer$$anonfun$$nestedInanonfun$executeHandler$1$1.applyOrElse(AkkaHttpServer.scala:252)
    at play.core.server.AkkaHttpServer$$anonfun$$nestedInanonfun$executeHandler$1$1.applyOrElse(AkkaHttpServer.scala:251)
    at scala.concurrent.Future.$anonfun$recoverWith$1(Future.scala:412)
    at scala.concurrent.impl.Promise.$anonfun$transformWith$1(Promise.scala:37)
    at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)
    at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70)
    at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68)
    at scala.concurrent.impl.Promise$DefaultPromise.dispatchOrAddCallback(Promise.scala:312)
Caused by: javax.persistence.PersistenceException: **Unable to build entity manager factory**
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:83)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at controllers.HomeController.index(HomeController.java:29)
    at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$2(Routes.scala:174)
    at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:136)
    at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:135)
    at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:110)
    at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:78)
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [models.Product]
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:245)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.buildHibernateConfiguration(EntityManagerFactoryBuilderImpl.java:1136)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:853)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
Caused by: java.lang.ClassNotFoundException: **Could not load requested class : models.Product**
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:230)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:348)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:242)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.buildHibernateConfiguration(EntityManagerFactoryBuilderImpl.java:1136)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:853)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)

Product.java(模型类)

package models;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

@Entity
public class Product {
    private static List<Product> products;
    @Id
    @GeneratedValue
    private String ean;
    @Column
    private String name;

    @Column
    private String description;

    public Product() {
    }

    public Product(String ean, String name, String description) {
        this.ean = ean;
        this.name = name;
        this.description = description;
    }

    public String toString() {
        return String.format("%s -%s", this.ean, this.name);
    }

    static {
        products = new ArrayList<Product>();
        products.add(new Product("11111111", "Clip 1", "description 1"));
        products.add(new Product("22222222", "Clip 2", "description 2"));
        products.add(new Product("33333333", "Clip 3", "description 3"));
        products.add(new Product("44444444", "Clip 4", "description 4"));
        products.add(new Product("55555555", "Clip 5", "description 5"));
    }

    public static List<Product> findAll() {
        return new ArrayList<Product>(products);
    }

    public static Product findByEan(String ean) {
        for (Product candidate : products) {
            if (candidate.ean.equals(ean)) {
                return candidate;
            }
        }
        return null;
    }

    public static List<Product> findByName(String term) {
        final List<Product> results = new ArrayList<Product>();
        for (Product candidate : products) {
            if (candidate.name.toLowerCase().contains(term.toLowerCase())) {
                results.add(candidate);
            }
        }
        return results;
    }

    public static boolean remove(Product product) {
        return products.remove(product);
    }

    public void save() {
        products.remove(findByEan(this.ean));
        products.add(this);
    }

    public static List<Product> getProducts() {
        return products;
    }

    public String getEan() {
        return ean;
    }

    public void setEan(String ean) {
        this.ean = ean;
    }

    public String   getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

}

还有 Homecontroller.java

package controllers;

import models.Product;
import org.hibernate.jpa.HibernatePersistenceProvider;
import play.data.FormFactory;
import play.libs.concurrent.HttpExecutionContext;
import play.mvc.*;

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

public class HomeController extends Controller {

    private final FormFactory formFactory;
    private final HttpExecutionContext ec;

    @Inject
    public HomeController(FormFactory formFactory, HttpExecutionContext ec) {
        this.formFactory = formFactory;
        this.ec = ec;
    }

    public Result index() {
        //Create a database and add some entries
        Product newproduct=new Product();

        EntityManagerFactory entityManagerFactory= Persistence.createEntityManagerFactory("test");
//Stuck at the above statment
        EntityManager entityManager=entityManagerFactory.createEntityManager();
        entityManager.getTransaction().begin();


        newproduct.setEan("111");
        newproduct.setName("Lapy");
        newproduct.setDescription("Uska description");

        entityManager.persist(newproduct);
        entityManager.getTransaction().commit();

        entityManager.close();
        entityManagerFactory.close();
        return ok(views.html.index.render("Database created check mysql"));
    }
}

EntitymanagerFactory 无法加载模型类产品。我已经在这个网站上尝试了各种解决方案,否则我不会发布。

【问题讨论】:

  • 如果它不能加载一个类,那么这个类不在一个可加载的位置(即 CLASSPATH)。由于您没有提供有关 CLASSPATH 中的内容的信息,因此不确定人们应该提供什么魔法咒语...
  • 尝试在你的Product 类中从private static List&lt;Product&gt; products; 中删除static
  • @AbdullahKhan 没有工作
  • @NeilStockton 在官方文档中给出了一个 jpa 示例。他们没有像我一样直接使用 Entitymanagerfactory。是这个问题吗?
  • 问题是类不在 CLASSPATH 中。您如何创建EntityManagerFactory 与此无关! java.lang.ClassNotFoundException: **Could not load requested class : models.Product** 意味着一件事,而且只有一件事

标签: java hibernate jpa playframework


【解决方案1】:

从您的 persistence.xml 中删除以下行

<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <non-jta-data-source>DefaultDS</non-jta-data-source>

&lt;persistence-unit name="test" transaction-type="RESOURCE_LOCAL"&gt; 之后提供

<class>models.Product</class>

【讨论】:

  • 我已经通过阅读其他答案尝试过这个,仍然无法正常工作
【解决方案2】:

终于找到了解决办法,创建实体管理器工厂和实体管理器并开始事务的代码应该写在控制器的构造函数中(我写在Homecontroller的index方法中) .数据库在mysql中创建。

【讨论】:

  • 我其实不知道为什么解决了这个问题,谁能赐教?
【解决方案3】:

修改META-INF\persistence.xml中的字符串:DefaultDS为DefaultDS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2016-03-17
    • 2014-05-20
    • 2013-05-01
    • 2013-11-07
    • 2015-06-18
    相关资源
    最近更新 更多