2013-08-17 70 views
2

我正在做下面的查詢來測試JPA是否從數據庫中檢索預期的結果。JPA query.getResultList()返回錯誤的對象?

我不明白爲什麼row instanceof Ativo返回false。 row.getClass()返回br.meuspila.entity.Ativo,打印對象是br.meuspila.entity.Ativo[ id=1 ]。該類的導入沒問題,並且在同一個包中沒有其他名爲Ativo的類。

// OUTPUT: 
INFO: br.meuspila.entity.Ativo[ id=1 ] // row 
INFO: false // row instanceof Ativo? 
INFO: class br.meuspila.entity.Ativo // row.getClass() 

MyMB類:

package br.meuspila.mb; 

import br.meuspila.database.JpaUtil; 
import br.meuspila.entity.Ativo; 
import java.util.List; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.SessionScoped; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityTransaction; 
import javax.persistence.Query; 

@ManagedBean 
@SessionScoped 
public class MyMB { 

    public String teste = "testando, 123"; 

    /** 
    * Creates a new instance of ManagedBean 
    */ 
    public MyMB() { 
    } 

    public String getTeste() { 
     return teste; 
    } 

    public void setTeste(String teste) { 
     this.teste = teste; 
    } 

    public void actionTeste() { 
     EntityManager em = JpaUtil.getInstance().createEntityManager(); 

     try { 
      EntityTransaction t = em.getTransaction(); 
      t.begin(); 

      Query query = em.createQuery("select x from Ativo x"); 
      List result = query.getResultList(); 

      for (Object row : result) { 
       System.out.println(row); 
       System.out.println(row instanceof Ativo); 
       System.out.println(row.getClass()); 
      } 

      t.commit(); 

     } finally { 
      em.close(); 
     }   
    } 

} 

JpaUtil類:

package br.meuspila.database; 

import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 

public final class JpaUtil { 

    private JpaUtil() { 
    } 

    public static JpaUtil getInstance() { 
     return JpaUtilHolder.INSTANCE; 
    } 

    private static class JpaUtilHolder { 
     private static final JpaUtil INSTANCE = new JpaUtil(); 
     private static final EntityManagerFactory EMF = Persistence.createEntityManagerFactory("MeusPila3_WebPU"); 
    } 

    public EntityManager createEntityManager() { 
     return JpaUtilHolder.EMF.createEntityManager(); 
    } 
} 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" 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"> 
    <persistence-unit name="MeusPila3_WebPU" transaction-type="JTA"> 
    <jta-data-source>jdbc/meuspiladb</jta-data-source> 
    <exclude-unlisted-classes>false</exclude-unlisted-classes> 
    <properties> 
    </properties> 
    </persistence-unit> 
</persistence> 

我的項目配置(Web項目):

JPA 2.1 - EclipseLink-2.5.0.v20130507-rNA 
GlassFish Server 4 

NetBeans IDE 7.3.1 (Build 201306052037) 
Java: 1.7.0_25; Java HotSpot(TM) 64-Bit Server VM 23.25-b01 
Runtime: Java(TM) SE Runtime Environment 1.7.0_25-b17 
System: Windows 7 version 6.1 running on amd64; Cp1252; pt_BR (nb) 

Project view on NetBeans 7.3.1

注:JpaUtil類是內部br.meuspila.database包。

+1

我沒有看到它的任何其他原因,打印'FALSE',比錯類的用法。你需要向我們展示更多的代碼。也許還有進口。 –

+1

假設您的導入是正確的,並且您沒有導入其他Ativo類 - 這很可能是某種類加載器問題。你在使用什麼樣的JPA實現以及在什麼環境下? – Sbodd

+0

給我一分鐘...我會發布完整的代碼。 – ceklock

回答

2

隨機加載器出現了!我不禁要看到整個應用程序 - 但在這裏您可以快速修復:從WEB-INF/lib中刪除Ativo類定義(更好的是整個bean包),並將所有bean放入容器lib路徑的歸檔中(請參閱到你的容器文檔)。這樣,由於委派,bean類將始終從同一個加載器加載。

同樣,請確保沒有bean類定義在WEB-INF中(既不在JAR中,也不在純的.class文件中)。如果您使用支持以下的構建工具,請嘗試將這些bean放入單獨的項目(子項目/模塊/子模塊)中,使其他項目依賴於它,並將依賴範圍設置爲,前提是(或等效項類需要編譯和測試,但不能包括在輸出神器,戰爭,罐子或耳朵)

+0

感謝您的回覆!你認爲我應該使用Eclipse還是其他IDE而不是Netbeans?我沒有更改任何類加載器配置,我想知道爲什麼會發生這種情況...... – ceklock

+1

應用程序使用的加載器不依賴於IDE - 該主題不適合使用註釋,因此您可以做的最好的事情是瞭解這個錯誤是閱讀關於類加載機制並玩了幾天(如果可以的話)。你是否嘗試過我建議的修復方法,即從各處除去容器的lib路徑(或類路徑)的bean定義? – Raffaele

+0

我還沒有嘗試修復。我會告訴你它是否有效。 – ceklock

0

正如@Rafaelle建議,我認爲問題是我的單身類:JpaUtil。通過刪除該類來修復代碼。

也許如果我改變了這個類,問題就會解決。我正在觀察它並注意到我做了一些(可能)錯誤的:在單例中,我嘗試在內部類(JpaUtilHolder)內創建2個實例...也許我應該從該內部類中刪除EMF,並將其作爲非靜態JpaUtil類的屬性。

替換MyMB:

EntityManager em = JpaUtil.getInstance().createEntityManager(); 

通過

EntityManagerFactory emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT); 
EntityManager em = emf.createEntityManager(); 
+1

如果您可以分享整個項目和重現錯誤所需的步驟,這將會很有幫助,因此我們可以真正瞭解錯誤發生的原因,更多的人可能從中受益:) – Raffaele

+0

也許,但我認爲對Singleton類中的'Persistence.createEntityManagerFactory(...);'的靜態調用正在產生錯誤... – ceklock