2017-07-20 11 views
0

私はplay jpaを使用していますが、この発見されました。完全なStackoverflow couldnt解決策を見つけました。PersistenceException:ClassNotFoundによって引き起こされたエンティティマネージャファクトリを構築できません

私がしようとしていること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`[email protected]" 


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はモデルクラスの製品をロードすることができません。私はこのサイトでいろいろな解決策を試しました。

+0

クラスをロードできない場合、クラスはロード可能な場所(CLASSPATHなど)にありません。あなたはCLASSPATHに何があるのか​​についての情報を提供しないので、魔法の呪文の人々が何を提供するのかは分かりません。 –

+0

'static'を' Product'クラスの 'private static List ;'から削除しようとしています。 –

+0

@AbdullahKhan did not work –

答えて

0

を提供した直後とトランザクションの開始はコントローラのコンストラクタに書かれていなければなりません(私はHomecontrollerのインデックスメソッドでそれを書いています)。データベースはmysqlで作成されます。

+0

神様はこれがとても気分がいいです:) –

+0

私は実際にこの問題を解決した理由を誰にでも教えてくれますか? –

0

私は、最終的には、エンティティマネージャファクトリとエンティティマネージャを作成するためのコードを解決策を見つけ、あなたのpersistence.xmlから

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

を以下の行を削除し、<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">

<class>models.Product</class> 
+0

他の回答を読んでこれを試してもまだ動作していません –

関連する問題