簡體   English   中英

獲取Javassist類型而不是實際的Hibernate實體類型

[英]Getting Javassist types instead of actual Hibernate entity types

我偶然發現了一個非常惱人的情況:我使用Hibernate和Spring作為我的應用程序的后端,似乎在某些情況下,與特定實體關系的實體不會從DB獲取為正常的實體對象,但作為Javassist類型。 例如:

我的Campaign實體具有以下關系:

@Entity
@Table(name = "campaign")
public class Campaign implements Serializable {
  [..]
  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
        "campaign_id", "dealer_id" }), name = "campaign_has_dealer", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "dealer_id", nullable = false) })
  private List<Dealer> dealers = new ArrayList<Dealer>();

@ManyToMany
// (fetch = FetchType.LAZY)
@JoinTable(uniqueConstraints = @UniqueConstraint(columnNames = {
        "campaign_id", "sales_area_id" }), name = "campaign_has_sales_area", joinColumns = { @JoinColumn(name = "campaign_id", nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "sales_area_id", nullable = false) })
private List<SalesArea> salesAreas = new ArrayList<SalesArea>();
}

在檢索連接到此Campaign的salesAreas后,我得到SalesArea _ $$ _ javassist_56的列表,而對於經銷商,我獲得了正常的Hibernate實體。 由於客戶端部分基於GWT,我們使用RequestFactory來檢索內容。 我最初認為這是代理,定位器等問題,但是我在服務中設置了一個斷點,在這些斷點中檢索這些斷點,並且在選擇它們之后直接將它們作為Javassist對象。 看起來即使刪除FetchType.LAZY注釋(雖然絕對不是理想的解決方案),同樣的事情也會發生。 這也發生在其他類型的關系中,而不僅僅是@ManyToMany。

我們使用GWT 2.3,Spring 3,Hibernate 3.6.3和JPA 2.0進行注釋。

任何建議,將不勝感激。

提前致謝

據我所知,你遇到的最大問題不是你的關聯的獲取類型,而是代理類型與RequestFactory不能很好地協作。

是的,它可以通過改變獲取策略來解決,但這聽起來像一個弱的解決方法,可能會破壞奇怪的情況。

我不記得究竟如何解決它,但我做到了,據我所知,ServiceLayerDecorator類中有一個擴展點。 基本上你檢查你要返回的對象是否是Hibernate代理(檢查Hibernate和HibernateProxy類),然后在ServiceLayerDecorator中返回非代理類型。 http://code.google.com/p/google-web-toolkit/issues/detail?id=6767

至於你的獲取策略,我主要推薦@BatchSize(N),其中N很大(可能是1000),但這是一個獨立的主題。

祝好運!

如果調用靜態方法:HibernateProxyHelper.getClassWithoutInitializingProxy(entity); 如果沒有代理,你得到代理實體的類和類本身。

使用Hibernate的代理模型,現在使用Javassist來幫助避免傳統的Hibernate運行時反射操作速度變慢,使用完全字節碼增強解決方案(如DataOucleus)的人們享受干凈,直觀的體驗。

就個人而言,我永遠看不到堅持(赦免雙關語)解決方案導致如此多問題的感覺,並在網上填寫有關破碎代碼的問題,這些代碼需要奇怪的,不直觀的解決方法,但人們還是......

但是,回到問題:如果您使用JPA,問題的一個解決方案是使用DataNucleus / JPA,它帶來了DataNucleus / JDO的許多好處(干凈的底層實現 - 沒有代理,沒有Javassist類等, )在符合JPA的實現中 - 即您不需要更改現有的源代碼即可開始使用它。

暫無
暫無

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

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