Json lib 對於hibernate的懶載入的存在問題的解決方法
1.Hibernate 的session關閉問題
由於成員變數是懶載入方式配置,所以當通過JSON轉換時,json lib 呼叫物件的getXX方法是,hibernate會臨時再去載入關聯物件,但是此時的session早已經關閉,所以會丟擲異常:could not initialize proxy - the owning Session was closed
解決方法:將session保留在某個請求執行緒內,知道request請求結束返回。spring提供了這樣一個filter
<!-- Hibernate Open Session In View filter -->
<filter>
<filter-name>hibernateOpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<!-- 放在struts filter之前 -->
<filter-mapping>
<filter-name>hibernateOpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.動態代理類屬性過濾問題
由於延遲載入獲得的物件,並不是我們自己寫的型別,而是由cglib位元組碼生成器生成的動態代理型別,在這個子類中又添加了新的屬性,所以當通過json lib轉換時,會丟擲異常:java.sql.SQLException: Positioned Update not supported
解決方法:將cglib中新增的屬性過濾掉,
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
JSON json = JSONSerializer.toJSON(bean, jsonConfig);
3.關聯物件的過濾問題
由於hibernate提供實體將的關聯關係的配置,所以物件之間增加了耦合關係,如果通過json轉換生成字串,勢必導致關聯物件之間的呼叫,造成資訊的洩露,所以必須對關聯物件欄位或關鍵資訊進行過濾,通過jsonConfig.setExcludes(new String[]{”"}); 可以解決這個問題。但是不同型別的物件都要過濾指定自己的欄位,勢必很麻煩。如果你的hibernate的對映類時通過JPA配置的,我們可以通過判斷註解型別,過濾成員變數。自己寫了一個過濾方法:
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import net.sf.json.JSON;
import net.sf.json.JSONSerializer;
import net.sf.json.JsonConfig;
/**
* @author Joshua
*
*/
public class CheJsonUtil {
public static JSON getJSON(Object bean) {
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(getExcludeFields(bean));
return JSONSerializer.toJSON(bean, jsonConfig);
}
/**
* 排除bean之間的關係欄位
* @param bean
* @return
*/
public static String[] getExcludeFields(Object bean) {
Set<String> list = new HashSet<String>();
list.add("handler");
list.add("hibernateLazyInitializer");
for (Class<?> superClass = bean.getClass(); superClass != Object.class; superClass = superClass
.getSuperclass()) {
Field[] fields = superClass.getDeclaredFields();
for (Field field : fields) {
if (field.getAnnotation(OneToOne.class) != null
|| field.getAnnotation(OneToMany.class) != null
|| field.getAnnotation(ManyToOne.class) != null
|| field.getAnnotation(ManyToMany.class) != null) {
list.add(field.getName());
}
}
}
return list.toArray(new String[list.size()]);
}
}
相關推薦
Json lib 對於hibernate的懶載入的存在問題的解決方法
1.Hibernate 的session關閉問題 由於成員變數是懶載入方式配置,所以當通過JSON轉換時,json lib 呼叫物件的getXX方法是,hibernate會臨時再去載入關聯物件,但是此時的session早已經關閉,所以會丟擲異常:could not
Hibernate懶載入問題解決
解決Hibernate:could not initialize proxy-no Session 出現的問題:不能初始化,沒有session(session關閉) 在Hibernate中,<many-to-one ../>中的lazy預設為proxy,這
對於hibernate懶載入模式報錯處理
在開發專案的過程中碰到了一些和hibernate懶載入有關的錯誤,記錄一下。 在實際開發中,我們常常會將兩個表關聯起來(設定外來鍵),這在hibernate對映為物件時會變成兩個物件關聯(即一個物件有另一個物件的引用),這本來是一個非常好用的機制,但
hibernate懶載入異常解決方案.
本文章主要講解hibernate套上spring,struts2/springMVC,出現的懶載入異常. 懶載入異常是由於session的關閉引起的 , 一般是出現在當資料從controller控制層傳到view前臺頁面進行迭代時出 現 , 大多數情況下, 我們會將事
解決hibernate懶載入問題No session的問題
<!-- 解決懶載入問題 --> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframewo
解決Hibernate懶載入的4種方式
本文總結了我在學習hibernate的過程中,解決hibernate懶載入問題的四種方式。 懶載入簡述:當我們查詢一個物件的時候,在預設情況下,返回的只是該物件的代理物件,當用戶去使用該物件的屬性時,才會向資料庫再一次發出查詢語句。 例如,有一個物件是Employee,還有
jackson關於json序列化與hibernate懶載入衝突
一開始用jpa加上jackson自動轉換物件為json資料 前臺用vue覺得很方便然後做分頁的時候,發現查詢一個物件,會這個物件關聯的表都查詢一遍,這樣就會太慢,然後關聯表也會出問題。網上看了一些方法 把OneToMany物件設定懶載入 把ManyToOn物件設定EAGER
spring boot hibernate 懶載入解決方案
spring boot 是快速構建微服務的新框架。對於資料訪問問題可以直接使用jpa技術,但是在單元測試發現spring jpa存在hibernate懶載入問題。hibernate懶載入異常但是spring-boot沒有xml配置檔案所以現在網路上好多的解決方案並不能適用在spring boot框架中。在遇到
Hibernate懶載入常見問題及解決方案
什麼是懶載入? 懶載入(Load On Demand)是一種獨特而又強大的資料獲取方法,它能夠在使用者滾動頁面的時候自動獲取更多的資料,而新得到的資料不會影響原有資料的顯示,同時最大程度上減少伺服器端的資源耗用。(百度說的) 通俗點,就是在找一個物件時不找出
Hibernate懶載入異常的解決與深刻分析
出現原因: Hibernate允許對關聯物件及屬性延遲載入,前提是這個操作在同一個Hibernate session範圍內進行.如果發生這樣的情況,當service層返回了一個
Hibernate懶載入的三種解決方案
Hibernate懶載入的兩種解決方案: 1.Hibernate.initialize(代理物件) 2.在*.hbm.xml對映檔案中新增lazy="false"屬性 3.使用opensess
淺談解決Hibernate懶載入的4種方式
這篇文章是我在學習hibernate的懶載入時整理的資料,主要介紹瞭解決Hibernate懶載入的4種方式,具有一定借鑑價值,需要的朋友可以參考下。 本文總結了我在學習hibernate的過程中,解決hibernate懶載入問題的四種方式。 所謂懶載入(lazy)就
解決hibernate懶載入異常
事務的處理都是在service層進行解決 hibernate預設是進行懶載入 那麼其實在service處理完事務後 session就會進行關閉 而當我們在頁面再去呼叫 本物件中的子物件的相關屬性的時候 因為session已經關閉了 所以就會存在懶載入異常 即ses
徹底解決SSH架構中的Hibernate懶載入問題
在客戶端使用AJAX框架,服務端採用Struts2+Spring+Hibernate的架構中,經常會遇到Hibernate懶載入的問題 ,異常為: org.hibernate.LazyInitializationException: failed to la
【java】itoo項目實戰之hibernate 懶載入優化性能
bsp xtra extra pda 程序 前端框架 外連接 獲取 轉換成 在做itoo 3.0 的時候,考評系統想要上線,就開始導入數據了,僅僅導入學生2萬條數據,可是導入的速度特別的慢。這個慢的原因是由於導入的時候進行了過多的IO操作。可是導入成功之後,
SSH:hibernate懶載入導致的no Session
在hibernate中,我們經常會設定兩個實體之間的關係為 <one-to-one> <many-to-many> <one to many> 用來描述兩張表之間的關係,如一個員工有多種職務,而一個職務由多個員工擔任,我們在查詢員工的時候,需
hibernate懶載入導致session關閉後無法在view層得到關聯資料
在controller中查詢出了一個數據,資料關聯了另外一個物件,在頁面中用A.GETB().GETXXX()的方式的時候就會報錯,因為是懶載入,預設的session已經關閉了。 解決方案:在web.xml配置檔案中加入以下內容 <filter> <fi
Hibernate懶載入詳解
兩邊關於hibernate懶載入的文章,轉過來收藏 轉自:https://www.cnblogs.com/cornucopia/articles/4541621.html 轉自:https://yq.aliyun.com/ziliao/281376 H
hibernate懶載入的原理和作用
一.什麼是懶載入?他的作用? 延遲載入,也叫懶載入,它是hibernate為提高程式執行效率而提供的一種機制,即只有真正使用該物件的資料時才會建立。 Hibernate中主要是通過代理(proxy)機制來實現延遲載入。它的具體過程:Hibernate從資料庫獲取某一個
vue非同步元件與元件懶載入(解決import不能匯入變數字串的路徑問題)
在寫專案的時候,需要動態配置路由選單,所有的選單都是通過配置生成的,這就意味著選單的路徑(在vue開發專案裡面就是一個字串的路徑)需要非同步載入進去,但是由於對webpack的import不是很熟悉,所以就有一下的坑需要填了 錯誤的原因分析 _import.js module.e