2017-12-25 6 views
0

Ich versuche, meine Java-Play-Anwendung mit Hibernate Orm zu integrieren und hier ist meine Projektstruktur.Play Framework 2.6.x Integration mit Hibernate Orm 4.3.1 Mapping-Fehler

enter image description here

Wie Sie sehen können, habe ich meine POJOs in einem Paket models und hibernate.cfg.xml innen conf genannt platziert.

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db_name</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">password</property> 
     <property name="show_sql">true</property> 
     <property name="format_sql">true</property> 
     <property name="hibernate.enable_lazy_load_no_trans">true</property> 

     <mapping resource="models/Coating.hbm.xml"/> 
     <mapping resource="models/Fitting.hbm.xml"/> 
     <mapping resource="models/Product.hbm.xml"/> 
     <mapping resource="models/ProductHasCoating.hbm.xml"/> 
     <mapping resource="models/ProductHasFitting.hbm.xml"/> 
     <mapping resource="models/ProductHasSize.hbm.xml"/> 
     <mapping resource="models/Size.hbm.xml"/> 

    </session-factory> 
</hibernate-configuration> 

HibernateUtil Klasse: (innen services)

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.AnnotationConfiguration; 

public class HibernateUtil { 

    private static final SessionFactory sessionFactory; 

    static { 
     try { 
      // Create the SessionFactory from standard (hibernate.cfg.xml) 
      // config file. 
      sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      // Log the exception. 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 

Controller-Klasse

public class LoginController extends Controller { 

    public Result login() throws SQLException { 
     Session s = HibernateUtil.getSessionFactory().openSession(); 
     Criteria c = s.createCriteria(Coating.class); 
     c.add(Restrictions.eq("code", "CO3444")); 
     Coating co = (Coating) c.uniqueResult(); 
     String title = co.getTitle(); 
     s.close(); 
     return ok(views.html.login_page.login.render(title)); 
    } 
} 

Alles scheint gut für mich und sobald ich die Anwendung kompilieren und ausführen, beendet es den Anwendungsserver mit unten Fehler.

Initial SessionFactory creation failed.org.hibernate.InvalidMappingException: Could not parse mapping document from resource models/Coating.hbm.xml 
Uncaught error from thread [play-dev-mode-akka.actor.default-dispatcher-4]: null, shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for for ActorSystem[play-dev-mode] 
java.lang.ExceptionInInitializerError 
     at services.HibernateUtil.<clinit>(HibernateUtil.java:18) 
     at controllers.LoginController.login(LoginController.java:15) 
     at router.Routes$$anonfun$routes$1.$anonfun$applyOrElse$2(Routes.scala:164) 
     at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:134) 
     at play.core.routing.HandlerInvokerFactory$$anon$3.resultCall(HandlerInvoker.scala:133) 
     at play.core.routing.HandlerInvokerFactory$JavaActionInvokerFactory$$anon$8$$anon$2$$anon$1.invocation(HandlerInvoker.scala:108) 
     at play.core.j.JavaAction$$anon$1.call(JavaAction.scala:82) 
     at play.http.DefaultActionCreator$1.call(DefaultActionCreator.java:31) 
     at play.core.j.JavaAction.$anonfun$apply$8(JavaAction.scala:132) 
     at scala.concurrent.Future$.$anonfun$apply$1(Future.scala:653) 
     at scala.util.Success.$anonfun$map$1(Try.scala:251) 
     at scala.util.Success.map(Try.scala:209) 
     at scala.concurrent.Future.$anonfun$map$1(Future.scala:287) 
     at scala.concurrent.impl.Promise.liftedTree1$1(Promise.scala:29) 
     at scala.concurrent.impl.Promise.$anonfun$transform$1(Promise.scala:29) 
     at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60) 
     at play.core.j.HttpExecutionContext$$anon$2.run(HttpExecutionContext.scala:56) 
     at play.api.libs.streams.Execution$trampoline$.execute(Execution.scala:70) 
     at play.core.j.HttpExecutionContext.execute(HttpExecutionContext.scala:48) 
     at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:68) 
     at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete(Promise.scala:368) 
     at scala.concurrent.impl.Promise$KeptPromise$Kept.onComplete$(Promise.scala:367) 
     at scala.concurrent.impl.Promise$KeptPromise$Successful.onComplete(Promise.scala:375) 
     at scala.concurrent.impl.Promise.transform(Promise.scala:29) 
     at scala.concurrent.impl.Promise.transform$(Promise.scala:27) 
     at scala.concurrent.impl.Promise$KeptPromise$Successful.transform(Promise.scala:375) 
     at scala.concurrent.Future.map(Future.scala:287) 
     at scala.concurrent.Future.map$(Future.scala:287) 
     at scala.concurrent.impl.Promise$KeptPromise$Successful.map(Promise.scala:375) 
     at scala.concurrent.Future$.apply(Future.scala:653) 
     at play.core.j.JavaAction.apply(JavaAction.scala:132) 
     at play.api.mvc.Action.$anonfun$apply$2(Action.scala:96) 
     at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$4(Accumulator.scala:174) 
     at scala.util.Try$.apply(Try.scala:209) 
     at play.api.libs.streams.StrictAccumulator.$anonfun$mapFuture$3(Accumulator.scala:174) 
     at scala.Function1.$anonfun$andThen$1(Function1.scala:52) 
     at scala.Function1.$anonfun$andThen$1(Function1.scala:52) 
     at play.api.libs.streams.StrictAccumulator$$anon$1.apply(Accumulator.scala:218) 
     at play.api.libs.streams.StrictAccumulator$$anon$1.apply(Accumulator.scala:217) 
     at java.util.function.Function.lambda$andThen$1(Function.java:88) 
     at java.util.function.Function.lambda$andThen$1(Function.java:88) 
     at play.libs.streams.Accumulator$StrictAccumulator$1.apply(Accumulator.java:403) 
     at play.libs.streams.Accumulator$StrictAccumulator$1.apply(Accumulator.java:400) 
     at scala.Function1.$anonfun$andThen$1(Function1.scala:52) 
     at scala.Function1.$anonfun$andThen$1(Function1.scala:52) 
     at scala.Function1.$anonfun$andThen$1(Function1.scala:52) 
     at play.api.libs.streams.StrictAccumulator.run(Accumulator.scala:207) 
     at play.core.server.AkkaHttpServer.executeAction(AkkaHttpServer.scala:298) 
     at play.core.server.AkkaHttpServer.executeHandler(AkkaHttpServer.scala:255) 
     at play.core.server.AkkaHttpServer.handleRequest(AkkaHttpServer.scala:201) 
     at play.core.server.AkkaHttpServer.$anonfun$createServerBinding$1(AkkaHttpServer.scala:107) 
     at akka.stream.impl.fusing.MapAsync$$anon$24.onPush(Ops.scala:1191) 
     at akka.stream.impl.fusing.GraphInterpreter.processPush(GraphInterpreter.scala:512) 
     at akka.stream.impl.fusing.GraphInterpreter.processEvent(GraphInterpreter.scala:475) 
     at akka.stream.impl.fusing.GraphInterpreter.execute(GraphInterpreter.scala:371) 
     at akka.stream.impl.fusing.GraphInterpreterShell.runBatch(ActorGraphInterpreter.scala:584) 
     at akka.stream.impl.fusing.GraphInterpreterShell$AsyncInput.execute(ActorGraphInterpreter.scala:468) 
     at akka.stream.impl.fusing.GraphInterpreterShell.processEvent(ActorGraphInterpreter.scala:559) 
     at akka.stream.impl.fusing.ActorGraphInterpreter.akka$stream$impl$fusing$ActorGraphInterpreter$$processEvent(ActorGraphInterpreter.scala:741) 
     at akka.stream.impl.fusing.ActorGraphInterpreter$$anonfun$receive$1.applyOrElse(ActorGraphInterpreter.scala:756) 
     at akka.actor.Actor.aroundReceive(Actor.scala:517) 
     at akka.actor.Actor.aroundReceive$(Actor.scala:515) 
     at akka.stream.impl.fusing.ActorGraphInterpreter.aroundReceive(ActorGraphInterpreter.scala:666) 
     at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527) 
     at akka.actor.ActorCell.invoke(ActorCell.scala:496) 
     at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) 
     at akka.dispatch.Mailbox.run(Mailbox.scala:224) 
     at akka.dispatch.Mailbox.exec(Mailbox.scala:234) 
     at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 
     at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 
     at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 
     at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 
Caused by: org.hibernate.InvalidMappingException: Could not parse mapping document from resource models/Coating.hbm.xml 
     at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3764) 
     at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXmlQueue(Configuration.java:3753) 
     at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3741) 
     at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1410) 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1844) 
     at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1928) 
     at services.HibernateUtil.<clinit>(HibernateUtil.java:14) 
     ... 71 more 
Caused by: org.hibernate.MappingException: class models.Coating not found while looking for property: id 
     at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:233) 
     at org.hibernate.mapping.SimpleValue.setTypeUsingReflection(SimpleValue.java:362) 
     at org.hibernate.cfg.HbmBinder.bindSimpleId(HbmBinder.java:453) 
     at org.hibernate.cfg.HbmBinder.bindRootPersistentClassCommonValues(HbmBinder.java:386) 
     at org.hibernate.cfg.HbmBinder.bindRootClass(HbmBinder.java:326) 
     at org.hibernate.cfg.HbmBinder.bindRoot(HbmBinder.java:177) 
     at org.hibernate.cfg.Configuration$MetadataSourceQueue.processHbmXml(Configuration.java:3761) 
     ... 77 more 
Caused by: java.lang.ClassNotFoundException: models.Coating 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
     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:264) 
     at org.hibernate.internal.util.ReflectHelper.classForName(ReflectHelper.java:193) 
     at org.hibernate.internal.util.ReflectHelper.reflectedPropertyClass(ReflectHelper.java:229) 
     ... 83 more 

AKTUALISIERT

Aber sobald ich alle Zuordnungen von hibernate.cfg.xml entfernen und den LoginController Code unten ändern:

 Session s = HibernateUtil.getSessionFactory().openSession(); 
     Connection c = s.getSessionFactory().getSessionFactoryOptions().getServiceRegistry() 
       .getService(ConnectionProvider.class).getConnection(); 

     //Criteria c = s.createCriteria(Coating.class); 
     //c.add(Restrictions.eq("code", "CO3444")); 
     //Coating co = (Coating) c.uniqueResult(); 
     //String title = co.getTitle(); 
     //s.close(); 
     String title = c.getMetaData().getDatabaseProductName(); 
     return ok(views.html.login_page.login.render(title)); 

Anwendung startet und läuft gut in der Browser mit der Ausgabe MySQL Das bedeutet, es gibt keine Winterschlaf Konfigurationsfehler und keine Fehler mit der HibernateUtil Klasse entweder.

Jede Hilfe wäre nennenswert. Vielen Dank.

Antwort

0

In diesem Fall sucht play-framework nicht nach den XML-Mappings im Modellpaket. Also muss ich sie in conf Paket zusammen mit hibernate.cfg.xml setzen. Bild unten zeigt, wie die Projektstruktur wie folgt aussieht:

enter image description here

Und dann vergessen Sie nicht

Thread.currentThread().setContextClassLoader(OneOfYourModelClass.class.getClassLoader()); 

Linie innerhalb der HibernateUtil Klasse hinzuzufügen, bevor die Sitzung Fabrikgebäude.

... 
static { 
     try { 
      Thread.currentThread().setContextClassLoader(SomeClass.class.getClassLoader()); 
      sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
... 

so kann der Kontext ClassLoader einer Entity und die anderen sind auch geladen richtig eingestellt werden.

Verwandte Themen