JPA / SCALA Нет поставщика сохраняемости с именем xxx? - PullRequest
2 голосов
/ 01 ноября 2011

Когда я выполняю следующий код в scala REPL:

javax.persistence.Persistence.createEntityManagerFactory("manager1")

Я получаю

javax.persistence.PersistenceException: No Persistence provider for EntityManager named manager1

В том же проекте maven, работающем на Java, проблем нет (другими словами, я считаю, что мои зависимости настроены правильно)

Используя удаленный отладчик, я обнаружил, что проблема, кажется, в PersistenceProviderResolverHolder, где он выполнил следующий код:

Enumeration<URL> resources = cl.getResources( "META-INF/services/" + PersistenceProvider.class.getName() )

В возвращенном перечислении нет элементов.

Когда я выполняю тот же сеанс REPL

val cl = classOf[javax.persistence.spi.PersistenceProviderResolverHolder].getClassLoader()
cl.getResources( "META-INF/services/javax.persistence.spi.PersistenceProvider").hasMoreElements

Я понял "правда"

Это происходит как при использовании mvn: scala, так и при непосредственном использовании scala:

scala -cp "target/dependency/*":target/classes

Мои зависимости

[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ java.jpa.basics ---
[INFO] com.edc4it:java.jpa.basics:jar:1.0
[INFO] +- org.slf4j:slf4j-log4j12:jar:1.6.2:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.6.2:compile
[INFO] |  \- log4j:log4j:jar:1.2.16:compile
[INFO] +- mysql:mysql-connector-java:jar:5.1.6:compile
[INFO] +- javassist:javassist:jar:3.9.0.GA:compile
[INFO] +- org.scala-lang:scala-library:jar:2.9.1:compile
[INFO] \- org.hibernate:hibernate-entitymanager:jar:3.6.7.Final:compile
[INFO]    +- org.hibernate:hibernate-core:jar:3.6.7.Final:compile
[INFO]    |  +- antlr:antlr:jar:2.7.6:compile
[INFO]    |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO]    |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO]    |  +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
[INFO]    |  \- javax.transaction:jta:jar:1.1:compile
[INFO]    +- cglib:cglib:jar:2.2:compile
[INFO]    |  \- asm:asm:jar:3.1:compile
[INFO]    \- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile

Единственная выпущенная JPA зависимость - это "org.hibernate: hibernate-entitymanager: 3.6.7.Final"

Это похоже на проблему с загрузкой классов, но может ли это быть чем-то другим?

1 Ответ

1 голос
/ 03 ноября 2011

После еще нескольких копаний и отладки я обнаружил, что реализация JPA использует контекстный загрузчик классов текущего протектора (в моем случае это sun.misc.Launcher $ AppClassLoader).Этот загрузчик классов действительно не включает в себя JA-файлы JPA и Hibernate.(см. javax.persistence.spi.PersistenceProviderResolverHolder.PersistenceProviderResolverPerClassLoader # getContextualClassLoader). Изменение контекстного загрузчика классов перед получением EntityManagerFactory, поэтому выполняет хитрость:загрузчику классов приложения после его установки.

Я еще не знаю, каковы будут последствия (не уверен, что весь код JPA будет работать на самом деле, только что провел несколько тестов и, похоже, пока работает).Также я не понимаю, почему hibernate использовал контекстный загрузчик классов, а не только текущий загрузчик классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...