之前在jpa/hibernate+jsf+cdi的專案中老是遇到懶載入異常問題,解決辦法要不就是修改查詢語句,要不就是改為eager。
先看一下org.hibernate.collection.internal.abstractpersistentcollection的**,丟擲懶載入異常的原因在這裡:
if ( session == null )
else
} else if ( !session.isopen() )
else
} else if ( !session.isconnected() )
else
}
所以,只需要在集合**物件初始化之前,將session物件傳遞給集合**物件即可,所以,寫乙個jpa***,使用@postload註解攔截方法
public class lazyinitilazecollectionlistener else
set.add(field);
}}else if(field.isannotationpresent(manytomany.class))
set.add(field);}}
}synchronized (proxy_map)
} //若是o中有需要**的物件,此時set已經不為空了
if(set == null)
for(field field : set),new handler(fieldvalue));
field.set(o, obj);}}
} catch (illegalargumentexception e) catch (illegalacces***ception e) }}
/*** 到伺服器上查詢entitymanager物件,需要在persistence.xml檔案中先配置
* *
*
*
* @return
* @throws namingexception
*/private static entitymanager lookupentitymanager() throws namingexception
class handler implements invocationhandler
@override
public object invoke(object proxy, method method, object args) throws throwable catch (exception e)
}return method.invoke(obj, args);
} }}
我自己測試的時候是通過的,環境是wildfly 10,伺服器自帶的hibernate實現。
JPA懶載入失敗問題解決
在使用jpa或者hibernate的時候,我們經常用懶載入來提高訪問效率,例如 class aa物件中懶載入b物件。典型的使用場景 a a repository.finda setobjbs a.getobjbs 此時可能出現以下錯誤 org.hibernate.lazyinitialization...
解決EJB懶載入問題
對於ejb懶載入時,由於沒有hibernate中的opensessionview,那麼需要在會話結束之前就載入資料,可以選擇在dao層實現,如下 public tbldeliverywarrant find1 string id throws serviceexception deliverywar...
JPA中延遲載入異常的解決辦法
在使用jpa時,當表與表之間有關聯關係的時候,我們在設計表的關聯關係,使用註解設定的時候,如果在註解上新增了乙個 fetch fetchtype.lazy 屬性,就是設定為乙個懶載入的模式,即什麼時候需要使用這個資料,什麼時候在在去查詢,這個有時候就會出現問題 下面以employee員工和dept部...