2015-09-13 104 views
0

當我試圖從我的數據庫中獲取條目時,從EntityManager返回的類型與我的代碼中指定的類型不同。他們都com.mycompany.Foo,但他們已經與兩個不同的類裝載機instanciated。我發現第二種類型的類加載器將庫設置爲WEB-INF/classes /,並將jarPath設置爲/ WEB-INF/lib。 這是所有使用JPA和Hibernate設置的。休眠的JPA類加載問題

的persistence.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/persistence_2_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(引爆網絡應用程序),這可能是我的部署設置的問題嗎?他們目前正在通過Gradle通過戰爭插件進行定義。

+0

這不是由JPA/Hibernate引起的,所以它們對此沒有什麼作用。這是由錯誤的構建引起的。我對Gradle一點都不熟悉,但是你是說在'/ WEB-INF/classes'文件夾和'/ WEB-INF/lib'文件夾中有一個'com.mycompany.Foo'文件夾生成的WAR文件? – BalusC

+0

你在哪裏部署?你確定包含實體的jar不在應用服務器的類路徑中嗎?另外,由於看起來您使用的是EJB,因此它是一個完整的應用程序服務器,因此應用程序服務器應提供所有這些庫,因此它們應該位於providedCompile或providedRuntime配置中。 –

+0

這部署在Glassfish應用服務器上。 'Foo'不在'WEB-INF/lib'文件夾中,它只是將jarPath設置爲lib文件夾的類加載器。 providedCompile和提供的運行時是我可以在IntelliJ中的構建信息中設置的東西,還是應用程序服務器特定的東西?編輯:不,那些來自Gradle。 – Martin

回答

0

問題是,加載掃描註釋的@Entity類的庫的庫不在我的域的lib文件夾中。將項目的依賴關係移至此文件夾可解決我的問題。