2013-08-28 74 views
2

我嘗試從數據庫中檢索某些實體時遇到了一個奇怪的問題。實體所在的表格只有4行。當我嘗試選擇所有行時,我得到一個列表,第一個和最後一個元素加載正確,但是,第二個和第三個屬性都爲空。這裏是我的調試控制檯打印:爲什麼我要在結果集中獲取Javassist對象?

javassist problem debug

實體很簡單,你可以看到如下:

@Entity 
@Table(name = "Empresa") 
public class Empresa implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID_EMPRESA") 
    private Integer idEmpresa; 
    @Basic(optional = false) 
    @Column(name = "NOME_EMPRESA") 
    @OrderColumn 
    private String nomeEmpresa; 
    @Column(name = "CNPJ") 
    private String cnpj; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "iDEmpresa", fetch = FetchType.LAZY) 
    private List<Cadastro> cadastroList; 

} 

如果你想知道我是怎麼獲取的實體,這裏是代碼:

@Override 
public List<T> recuperarTodos() { 
    Query query = entityManager.createQuery(criarQueryRecuperarTodos()); 
    limitarQuantidadeDeRegistros(query); 
    return query.getResultList(); 
} 

private String criarQueryRecuperarTodos() { 
    StringBuilder builder = new StringBuilder("SELECT e FROM "); 
    builder.append(classe.getSimpleName()); 
    builder.append(" e"); 
    builder.append(criarParametrosOrdenacao()); 
    return builder.toString(); 
} 
+1

這些是代理。嘗試將您的抓取設置爲「EAGER」。 –

+0

在這種情況下,這是不可接受的,請注意,檢索到的第一個實體的cadastroList包含1478個實體。如果我在這裏使用熱切的話,一旦Cadastro實體是一個複雜的實體,並且與渴望取得一些關係,我會遇到性能問題。 – brevleq

+1

您是否解決了這個問題?我面臨同樣的問題! – lmo

回答

2

這是完全合法和預期的情況。 Hibernate使用動態生成的代理(因此javaassist對象,在過去,hibernate也使用cglib)作爲未完全獲取的實體的佔位符,以允許延遲獲取。正因爲如此,一般來說,您不應該嘗試直接訪問屬性值。使用getter可以讓hibernate發出適當的數據庫查詢並填充實體。這在某些情況下可能是個問題 - 例如,如果這些值是在Hibernate會話之外首先請求的。

+0

有沒有辦法讓這個問題最小化? – brevleq

+0

這通常不是問題,如果您使用getters而不是普通字段訪問,我看到您這樣做。在執行代碼期間,或者在調試控制檯中,您是否真的看到了空值?我想你是這麼做的,這就是爲什麼你在調試控制檯中檢查它的原因。也許它與hibernate會話生存期有關?不過,在這種情況下,我期望LazyInitializationException。 –

+0

嘗試展開代理對象的處理程序字段,您應該會看到您的'Empresa'對象的副本,其中數據用數據庫值填充 –

相關問題