hibernate與struts2整合中出現問題以及一級緩存查詢數據在業務層問題

来源:https://www.cnblogs.com/ends-earth/archive/2019/05/04/10809424.html
-Advertisement-
Play Games

直接上問題: 一開始報出 HibernateException,這個問題原因是:struts2和hibernate整合時,有些jar包衝突原因,如Javassist.jar,保留高版本吧。解決jar報衝突問題後又給報錯誤了。 上代碼: 我們知道;對於一些比較複雜的業務,事務都放在業務層開啟和關閉,我 ...


直接上問題:

  

org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Customer
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:130)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666)
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4462)
    at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:359)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274)
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129)
    at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:164)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2669)
    at org.hibernate.internal.SessionImpl.load(SessionImpl.java:965)
    at cn.xxx.dao.impl.CustomerDaoImpl.findOrderByCst(CustomerDaoImpl.java:45)
    at cn.xxx.dao.impl.CustomerDaoImpl.demo1(CustomerDaoImpl.java:52)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: java.lang.NoClassDefFoundError: javassist/util/proxy/Proxy
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123)
    ... 35 more
Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.Proxy
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 36 more

一開始報出 HibernateException,這個問題原因是:struts2和hibernate整合時,有些jar包衝突原因,如Javassist.jar,保留高版本吧。解決jar報衝突問題後又給報錯誤了。

18:50:37.720 [main] ERROR org.hibernate.proxy.pojo.javassist.JavassistProxyFactory - HHH000142: Javassist Enhancement failed: cn.xxx.pojo.Customer
java.lang.ClassCastException: cn.xxx.pojo.Customer_$$_javassist_3 cannot be cast to javassist.util.proxy.Proxy
    at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4462) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:359) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.doOnLoad(DefaultLoadEventListener.java:121) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:89) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.internal.SessionImpl.access$2600(SessionImpl.java:164) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.getReference(SessionImpl.java:2669) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at org.hibernate.internal.SessionImpl.load(SessionImpl.java:965) [hibernate-core-5.0.7.Final.jar:5.0.7.Final]
    at cn.xxx.dao.impl.CustomerDaoImpl.findOrderByCst(CustomerDaoImpl.java:45) [classes/:?]
    at cn.xxx.dao.impl.CustomerDaoImpl.demo1(CustomerDaoImpl.java:53) [classes/:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_112]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_112]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_112]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_112]
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) [junit.jar:4.12]
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit.jar:4.12]
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) [junit.jar:4.12]
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) [junit.jar:4.12]
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) [junit.jar:4.12]
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) [junit.jar:4.12]
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) [junit.jar:4.12]
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) [junit.jar:4.12]
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) [junit.jar:4.12]
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) [junit.jar:4.12]
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) [junit.jar:4.12]
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) [junit.jar:4.12]
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) [junit.jar:4.12]
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) [.cp/:?]
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) [.cp/:?]

上代碼:

@Override
    public Set<Order> findOrderByCst(Long cstId) {
     //這裡面getSession方法直接獲取當前線程的session對象 Session session
= HibernateSessionFactory.getSession(); Set<Order> orders = session.load(Customer.class, cstId).getOrders(); return orders; } @Test public void demo1(){ Session session = HibernateSessionFactory.getSession(); Transaction transaction = session.beginTransaction(); Set<Order> orders = findOrderByCst(1L); for (Order order : orders) { System.out.println(order); } transaction.commit(); }

我們知道;對於一些比較複雜的業務,事務都放在業務層開啟和關閉,我們經常需要保證連接對象的一致,不然可能導致某些邏輯操作成功另一些失敗,不符合原子性。這裡有一篇文章介紹的很詳細,概念和例子:https://blog.csdn.net/weixin_40657079/article/details/82055822。

那麼上面代碼就是基於dao層存放操作,service層存放事務。但是現在出現問題,查詢一對多的關聯對象時候,我用的時load方法,我們知道load是懶載入,他必須在有session的持久態情況才能使用,用的時候才會向資料庫發送數據,離開session進入脫管在查詢就會報錯。

解決辦法:

  1:不用懶載入。

    用get方法或者在配置映射文件配置lazy=false。這裡是一對多,一個顧客多個訂單,主控方為顧客,關聯方為訂單,所以在主控方set配置lazy=false(也就是配置關聯級別延遲載入)

  2:離線條件查詢(QBC檢索):

    指的是脫離session進行條件查詢,如果什麼條件都不設置就是查詢全部。

    Web層或者Service層獲取DetachedCriteria對象,

DetachedCriteria dc = DetachedCriteria.forClass(cCustomer.class)

    dao層:

Criteria criteria = dc.getExecutableCriteria(session);
criteria.list();

    這樣照樣可以使用懶載入,降低記憶體消耗

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • java中的集合分成哪幾類? java中的集合常見面試題有哪些? java中的集合你不知道的那些事? ...
  • jupyter notebook的插件安裝及文本格式修改 1.jupyter notebook拓展插件安裝 啟動jupyter notebook : 打開控制台輸入命令 jupyter notebook 安裝Jupyter notebook extensions擴展插件: 1、pip install ...
  • Flask信號 信號是可以在固定的事件發生時執行某些事情 一個簡單的使用信號的例子: from flask import Flask,signals app = Flask(__name__) def signal_func(*args,**kwargs): print('信號') signals. ...
  • 題目鏈接 Problem Description There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this ...
  • 過去學C++語法都是用的這本C++Primer第五版 說實話,這本書應該是業界用的最多的一本類似於C++語法的百科全書了。。 但是感覺自己學了這麼長時間的C++,語法層次還是不夠牢固。 比如template的使用,多個類之間的組合關係.我個人使用的都不是十分熟練。 尤其是在看C++STL源碼刨析的時 ...
  • day21 02 包的進階 1._init_.py文件的操作 導入包 根據day21 01 包的初識,建立的glance包,直接import glance後通過“包點包。。點方法”是不能執行所要的方法的,必須通過在一層一層裡面的_init_.py或者其他類似的文件做相對應的導入操作,才可以運行以下代 ...
  • 半次元COS圖爬取-寫在前面 今天在瀏覽網站的時候,忽然一個莫名的鏈接指引著我跳轉到了半次元網站 https://bcy.net/ 打開之後,發現也沒有什麼有意思的內容,職業的敏感讓我瞬間聯想到了 cosplay ,這種網站必然會有這個的存在啊,於是乎,我準備好我的大爬蟲了。 把上面的鏈接打開之後, ...
  • 網路編程-SOCKET開發 網路編程架構分類 B/S架構 B指的是web(網頁),S指的是Server(服務端軟體) C/S架構 C指的是Client(客戶端軟體),S指的是Server(服務端軟體) OSI七層模型 OSI七層模型設計的目的 是成為一個所有電腦廠商都能實現的開放網路模型,來剋服使 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...