1. 程式人生 > >Json lib 對於hibernate的懶載入的存在問題的解決方法

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