簡體   English   中英

JPA查詢返回代理實體

[英]JPA query returns proxied entities

假設我有2個實體,EntityA和EntityB。
EntityB是與EntityA相關的@OneToOne

@Entity
public class EntityB {
    @OneToOne(fetch = FetchType.LAZY)
    private EntityA entA;

    // other stuff
}

當我從數據庫加載EntityB時,相應的EntityA(例如entA1 )被延遲加載。
之后,我通過加載EntityA列表

   List result = entityManager.createQuery("select A from EntityA A")
                  .setFirstResult(start).setMaxResults(end).getResultList();

結果列表包含先前延遲加載和代理的EntityA以及正常的物化EntityAs,例如:

EntityA
EntityA_$$_javassist_nnn   <--- entA1 which is loaded lazily earlier
EntityA
...

所以我的問題是:
1)這是預期的行為嗎? 在哪里可以找到有關該文件的apidoc信息?
2)我可以只完全加載代理實體還是熱切地加載所有實體? 不混。

是的,這是預期的行為。 Hibernate會竭盡所能在會話中擁有一個實體的實例,並且只有一個實例。 由於它已經具有在加載EntityB時存儲在會話中的EntityA代理,因此返回相同EntityA實例的后續查詢實際上將返回相同的實例:該代理已存儲在會話中。

您不必在意列表中包含代理的事實。 在代理上調用任何方法( getClass()除外)都將返回與在未代理實體上調用它相同的結果。

AFAIK,盡管對象甚至沒有equals()方法,但是這使得實體的集合與附加對象的行為正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM