簡體   English   中英

休眠實體getter中的LazyInitializationException

[英]LazyInitializationException in Hibernate Entity getter

當我對ItemVersionLanguage對象執行Hibernate merge()時,出現“錯誤[org.hibernate.LazyInitializationException](pool-9-thread-1)無法初始化代理-沒有會話:org.hibernate.LazyInitializationException:無法初始化代理-沒有會話”。

但是,當我從中獲取數據時,可以從ItemVersion或ItemVersionLanguage的url正常工作。

我沒有@Transactional包裹merge()所在的代碼。

ItemVersionLanguage.java

@Entity
@Table(name = "item_version_language")
public class ItemVersionLanguage implements java.io.Serializable {
   private String url;
   private ItemVersion itemVersion;

   public void setUrl(String url)
   {
      this.url = url;
   } 
   @Column(name = "url")  
   public String getUrl()
   {
      if(this.url == null)
      {
          return this.itemVersion.url; //this results in the problem!
      }
      else
      {
          return this.url;
      }
   }
   public void setItemVersion(ItemVersion itemVersion)
   {
       this.itemVersion = itemVersion;
   }

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "item_version_obj_id", nullable = false)
   public ItemVersion getItemVersion()
   {
       return this.itemVersion;
   }
}

ItemVersion.java

@Entity
@Table(name = "item_version")
public class ItemVersion implements java.io.Serializable {
   private String url;

   public void setUrl(String url)
   {
      this.url = url;
   }   
   @Column(name = "url")
   public String getUrl()
   {
      return this.url;
   }
}

我做錯什么了嗎?

延遲初始化使變量可以充當代理,可以根據需要獲取其值。 當代碼在關閉檢索實體的會話之后嘗試從變量中讀取時,會發生此錯誤,這使代理無法延遲獲取其值。

您可以使用Hibernate.initialize(itemVersionLanguage.getItemVersion())在關閉會話之前加載代理的值。

有關更多詳細信息,請參見http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization

暫無
暫無

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

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