Когда я пытаюсь получить запись из своей базы данных, тип, возвращаемый из EntityManager, отличается от типа, указанного в моем коде. Они оба com.mycompany.Foo, но они были созданы с двумя разными загрузчиками классов. Я обнаружил, что загрузчик классов для второго типа имеет репозитории, установленные на WEB-INF/classes/ с jarPath, установленным на /WEB-INF/lib. Все это настроено с использованием JPA с Hibernate.
постоянство.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/persistencegroup 'testApplication'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'war'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile 'javax:javaee-api:7.0'
compile 'org.hibernate:hibernate-entitymanager:4.3.5.Final'
compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
compile 'mysql:mysql-connector-java:5.1.36'
}
0.xsd"
version="2.0">
<persistence-unit name="manager1" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>devResource</jta-data-source>
<validation-mode>CALLBACK</validation-mode>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
</properties>
</persistence-unit>
</persistence>
build.gradle с зависимостями:
group 'testApplication'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'war'
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile 'javax:javaee-api:7.0'
compile 'org.hibernate:hibernate-entitymanager:4.3.5.Final'
compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
compile 'mysql:mysql-connector-java:5.1.36'
}
Класс, извлекающий сущность:
@Stateless
public class FooService {
@PersistenceContext
private EntityManager em;
public Foo getFooEntity(final int id) {
// Will throw a CastException since Foo is not Foo (loaded through different class loaders)
return em.find(Foo.class, id);
}
}
Я компилирую это с помощью IntelliJ (веб-приложение Exploded), может ли это быть проблемой с моими настройками развертывания? В настоящее время они определяются Gradle через военный плагин.