1. 程式人生 > >Hibernate 異常總結

Hibernate 異常總結

unit delet rem handle repo 修改配置文件 主配置文件 插入 描述

異常一

異常一
異常描述: Sax解析異常:cvc-復雜的類型,發現了以元素maping開頭的無效內容,應該是以
‘{“http://www.hibernate.org/xsd/orm/cfg“:property, “http://www.hibernate.org/xsd/orm/cfg“:mapping, “http://www.hibernate.org/xsd/orm/cfg“:class-cache, “http://www.hibernate.org/xsd/orm/cfg“:collection-cache, “http://www.hibernate.org/xsd/orm/cfg“:event, “http://www.hibernate.org/xsd/orm/cfg“:listener}’
幾種之一開頭。
在使用hibernate框架存取數據的過程中,使用單元測試,後臺報錯
異常信息: org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException; cvc-complex-type.2.4.a: 發現了以元素 ‘maping’ 開頭的無效內容。應以 ‘{“http://www.hibernate.org/xsd/orm/cfg“:property, “http://www.hibernate.org/xsd/orm/cfg“:mapping, “http://www.hibernate.org/xsd/orm/cfg“:class-cache, “http://www.hibernate.org/xsd/orm/cfg“:collection-cache, “http://www.hibernate.org/xsd/orm/cfg“:event, “http://www.hibernate.org/xsd/orm/cfg“:listener}’ 之一開頭。]
異常原因: 在hibernate主配置文件中,寫入了無效的標簽。錯誤的標簽如下:
true
update


解決方案: 將maping改為mapping,問題解決

異常二

異常描述: Spi.服務異常:不能去創建一個被請求的服務

異常信息: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244) at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208) at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189) at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
異常原因: 經過仔細檢查,發現在dao層,沒有加載配置文件。
public class Demo { @Test //向數據庫中插入Customer對象 public void fun1(){ //1 加載配置 Configuration conf = new Configuration(); //2創建SessionFactory SessionFactory sf = conf.buildSessionFactory(); //3 獲得session Session session = sf.openSession(); //4 獲得並打開事務 Transaction tx = session.beginTransaction(); //5執行操作 Customer c = new Customer(); c.setCust_name(“哈哈”); session.save(c); //6提交事務,關閉資源 tx.commit(); session.close(); sf.close(); } }
需要在conf中加載configure();

解決方案: 沒有加載配置文件,需要加載配置文件。如下:
Configuration conf = new Configuration().configure();

異常三

異常描述: 服務器啟動過程中控制臺一直提示警告:設置屬性 資源到服務器中,hibernate不能發現匹配的屬性
發現後臺程序不報錯,但是數據庫表不能創建,數據也不能進行插入

異常信息: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ‘source’ to ‘org.eclipse.jst.jee.server:hibernate’ did not find a matching property.
異常原因: 經過仔細檢查,發現啟動異常,服務器啟動後一直警告,說hibernate不能找到匹配屬性,原因在於前臺的頁面中表單的屬性的name和數據庫中的字段以及實體類中的字段名稱不一致,導致前臺數據的值不能封裝插入到數據庫。

解決方案: 修改前臺頁面表單中的name屬性和實體類的name屬性以及映射文件中的字段一致。

異常四

異常描述: 映射異常:不能完成對24行10列的解析,cvc-complex-type.2.3: 元素 ‘beans’ 必須不含字符 [子級], 因為該類型的內容類型為“僅元素”
異常信息: Caused by: org.hibernate.boot.MappingException: Unable to perform unmarshalling at line number 24 and column 10. Message: cvc-complex-type.2.3: 元素 ‘class’ 必須不含字符 [子級], 因為該類型的內容類型為“僅元素”。 : origin(ceshi/demo1/Customer.hbm.xml)
異常原因: 在配置文件中ceshi/demo1/Customer.hbm.xml含有特殊字符

解決方案: 要規範,必須有結束。

異常五

異常描述: 屬性不能構建異常:無法找到字段和getter方法屬性命名(cn.itheima.web.domain.Customer # cust_user_id)
異常信息: org.hibernate.property.access.spi.PropertyAccessBuildingException: Could not locate field nor getter method for property named [cn.itheima.web.domain.Customer#cust_user_id]

異常原因: 映射配置文件中的實體屬性名和實體類中屬性名不一致
解決方案: 修改映射配置文件屬性名,保證名稱和實體類中屬性名稱一致

異常六

異常描述: org.hibernate.exception.sqlgrammarexception:創造模式遷移的數據庫信息誤差
異常信息: org.hibernate.exception.SQLGrammarException: Error creating DatabaseInformation for schema migration
異常原因: Hibernate核心配置文件中方言寫錯了

解決方案: 改成
org.hibernate.dialect.MySQLDialect

異常七

異常描述: Hibernate異常:一個錯誤:字段cust_id沒有一個默認值
異常信息: ERROR: Field ‘cust_id’ doesn’t have a default value
org.hibernate.exception.GenericJDBCException: could not execute statement
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
異常原因:在主配置文件(hibernate.cfg.xml)中設置的數據庫id的自增長策略單詞寫錯,導致數據庫主鍵id為空
解決方案: 修改正確的主鍵自增策略,常見的為native,increment

異常八

異常描述: hibernate資源關閉異常:servlet的service服務在路徑/hibernate_crm中拋出了一個異常

異常信息: 嚴重: Servlet.service() for servlet [AddCustomerServlet] in context with path [/Hibernate_crm] threw exception
org.hibernate.ResourceClosedException: org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl@e39b6f is closed
at org.hibernate.resource.jdbc.internal.AbstractLogicalConnectionImplementor.errorIfClosed(AbstractLogicalConnectionImplementor.java:38)
異常原因: 在使用hibernate保存對象的過程中,使用了本地線程綁定的session,當事務已經提交,本地線程綁定的session就已經自動關閉,但是該學員在dao層又一次關閉了session,就導致了session資源的重復關閉。
解決方案: 去掉dao層的關閉session的代碼,問題可以解決

異常九

異常描述: Hibernate異常:保存是無效的沒有一個有效的事務 問題發生在: cn.w.dao.impl.CustomerDaoImpl類中的save方法裏,在第16行
的問題是保存用戶信息操作,一直不能往數據庫保存用戶的信息
異常信息: 嚴重: Servlet.service() for servlet [AddCustomerServlet] in context with path [/Hibernate_crm] threw exception
org.hibernate.HibernateException: save is not valid without active transaction
at org.hibernate.context.internal.ThreadLocalSessionContextTransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:334)atcom.sun.proxy.TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:334)atcom.sun.proxy.Proxy29.save(Unknown Source)
at cn.w.dao.impl.CustomerDaoImpl.save(CustomerDaoImpl.java:16)
at
異常原因: 問題在於service層使用hibernateUtils獲得了一個session,但是在dao層保存用戶信息的時候又獲了了一個當前的session,兩個操作的session不一致,導致數據庫的數據不能正確插入。
解決方案: Service代碼修改如下,獲取一個本地session對象:Transaction tx = HibernateUtils.getCurrentSession().beginTransaction();
Dao層也是獲取當前的本地session對象:Session session = HibernateUtils.getCurrentSession();//獲得Session
只要保證操作數據的兩個session一致,數據即可插入

異常十

異常描述: 沒有 CurrentSessionContext 的配置
異常信息: org.hibernate.HibernateException: No CurrentSessionContext configured!
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:695)
at cn.itcast.util.HibernateUtil.getCurrentSession(HibernateUtil.java:29)
at cn.itcast.test.CstCustomerDemo.test1(CstCustomerDemo.java:31)
異常原因: 在執行cn.itcast.util.HibernateUtil類中getCurrentSession方法第29行出現異常,使用配置文件創建CurrentSession出現問題
解決方案: 第一種:使用 openSession() 替換 getCurrentSession()
第二種:修改配置文件,配置文件中綁定當前session的配置應該為:thread

異常十一

異常描述: 空指針異常
異常信息: cn.itcast.text.shuangtest01
demo01(cn.itcast.text.shuangtest01)
java.lang.NullPointerException
at cn.itcast.service.seviceImpl.ICstLinkmanAndCustomerServiceImpl.saveCustomerandCstLinkmen
異常原因: 將對象進行save操作時候出錯,因為保存時候需要session,而session獲取時出現問題
解決方案: Hibernate.cfg.xml配置文件中:
thread(正確)
thread(錯誤)

異常十二

異常描述: 初始化session工廠失敗!
異常信息: Exception in thread “main” java.lang.ExceptionInInitializerError: 初始化session工廠失敗!
at cn.itcast.utils.HibernateUtil.(HibernateUtil.java:22)
異常原因: 加載hibernate.cfg.xml的配置文件創建session工廠時失敗,配置文件存在問題
解決方案: 第一個:update只會自動創建表,並不會自動創建數據庫,所以需要根據hibernate.cfg.xml配置文件所連接的數據庫名先創建數據庫
第二個:實體類的hbm.xml配置文件中屬性名和實體類的屬性名不一致,需將實體類映射配置文件中的屬性名和實體類的屬性名保持一致

異常十三

異常描述: xml SAX解析異常:在配置文件的第22行,19列 即。該標簽包含了子級字符。
異常信息: org.xml.sax.SAXParseException; lineNumber: 22; columnNumber: 19; cvc-complex-type.2.3: 元素 ‘session-factory’ 必須不含字符 [子級], 因為該類型的內容類型為“僅元素”。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:437)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator$XSIErrorReporter.reportError(XMLSchemaValidator.java:458)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.reportSchemaError(XMLSchemaValidator.java:3237)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator.elementLocallyValidComplexType(XMLSchemaValidator.java:3200)
at com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidat
異常原因: 在hibernate.cfg.xml文件中 看一看字符集,是否有BOM 或

異常十四

異常描述: 該異常為:空指針異常,該異常發生在CustomerListServlet的第25行
異常信息: java.lang.NullPointerException
at cn.itcast.web.Servlet.CustomerListServlet.doGet(CustomerListServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at
異常原因: 在做查詢所有Customer對象,從dao層獲取到list list;返回到service層,service層的代碼,public List findAllCustomer() {
CustomerDao customerDao = new CustomerDao();
customerDao.findAllCustomer();

    return null;
}沒有返回List.所以在servlet層獲取到list的時候調用方法的時候報空指針異常。
  • 1
  • 2
  • 3

解決方案: 將代碼改為:public List findAllCustomer() {
CustomerDao customerDao = new CustomerDao();
return customerDao.findAllCustomer();
}即可。

異常十五

異常描述: 該異常為:hibernate的映射找不到異常,即映射資源找不到。
異常信息: org.hibernate.boot.MappingNotFoundException: Mapping (RESOURCE) not found : domain/Customer.hbm.xml : origin(domain/Customer.hbm.xml)
at org.hibernate.boot.spi.XmlMappingBinderAccess.bind(XmlMappingBinderAccess.java:56)
at org.hibernate.boot.MetadataSources.addResource(MetadataSources.java:274)
at org.hibernate.boot.cfgxml.spi.MappingReference.apply(MappingReference.java:70)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:413)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:692)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
at cn.itcast.utils.HibernateUtils.(HibernateUtils.java:18)
at cn.itcast.CustomerDao.CustomerDao.findAllCustomer(CustomerDao.java:33)
at cn.itcast.CutomerService.CustomerService.findAllCustomer(CustomerService.java:18)
at cn.itcast.web.Servlet.CustomerListServlet.doGet(CustomerListServlet.java:24)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at
異常原因: 在hibernate.cfg.xml中要引入映射文件,即
即找不到映射文件。
解決方案: 修改配置文件的路徑.這樣就可以加載到
映射配置文件。

異常十六

異常描述: 屬性入口創建異常:不能定位字段也不能從name屬性中獲得get方法
錯誤在實體類cn.ticast.domain.LinkMan # lkm_cust_id中
異常信息: 嚴重: Servlet.service() for servlet [AddLinkManServlet] in context with path [/day01_hibernate] threw exception [Servlet execution threw an exception] with root cause
org.hibernate.property.access.spi.PropertyAccessBuildingException:
Could not locate field nor getter method for property named [cn.ticast.domain.LinkMan#lkm_cust_id]at
異常原因: 在創建主外鍵關聯id(lkm_cust_id)的時候把該字段當做普通屬性寫入了LinkMan類中,並在LinkMan.hbm.xml中映射了該字段,導致後臺程序一直報錯。
解決方案: 在LinkMan類中去除lkm_cust_id這一屬性,並在映射文件中去除這一列( ),問題可以解決

異常十七

異常描述: 服務異常:不能去創建一個被請求的服務
異常信息: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51) 異常原因: 在進行兩張表(customer和linkMan)關聯數據的添加過程中,沒有在主配置文件(hibernate.cfg.xml)中引入linkMan的xml映射文件,導致服務不能正常運行
解決方案: 在hibernate主配置文件中引入兩個實體類的映射文件,問題可以解決
以下的配置都需要及時配置,如果沒有及時配置就容易出錯

異常十八

異常描述: Hibernate異常:方法DialectResolutionInfo 不能為空,hibernate方言沒有設置
異常信息: Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set
異常原因: 沒有加載核心配置文件
//創建配置實例對象
Configuration config = new Configuration();
//加載src’目錄下的配置文件
config.configure();
解決方案: 加載配置文件

異常十九

異常描述: 屬性使用建立異常:不能找到屬性名稱uid
異常信息: Caused by: org.hibernate.property.access.spi.PropertyAccessBuildingException: Could not locate field nor getter method for property named [cn.itheima.demo1.domain.Demo1#uid]
異常原因: 類名寫錯 解決方案:
改成uid所屬的類名

異常二十

異常描述: Hibernate異常:無法使用jdbc連接
異常信息: Caused by: org.hibernate.HibernateException: Unable to make JDBC Connection [dbc:mysql:///hibernate_day02]
異常原因: 核心配置文件jdbc連接寫錯 解決方案: 改成jdbc:mysql

異常二十一

異常描述: 數據異常:不能在Hibernate內部執行更新操作
異常信息: org.hibernate.exception.DataException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:52) at
…..
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘lkm_phone’ at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2983) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) at
異常原因: 造成的原因是數據截斷:lkm_phone字段數據過長。經過仔細查看,發現在數據庫見表過程中給lkm_phone這個字段的長度是一個字節,長度太小,導致數據空間不能存儲
解決方案: 修改數據庫表中該字段的長度,修改成給定字段長度20個字節

異常二十二

異常描述: 類型不匹配異常:為cn.itcast.domain.Customer類提供了一個錯誤的id匹配類型
異常信息: Servlet.service() for servlet [SaveLinkmanServlet] in context with path [/hibernate_my-crm2] threw exception org.hibernate.
TypeMismatchException: Provided id of the wrong type for class cn.itcast.domain.Customer. Expected: class java.lang.Long, got class java.lang.String at org.hibernate.event.internal.DefaultLoadEventListener.checkIdClass(DefaultLoadEventListener.java:166) at…..
異常原因: 在給customer類設定id字段時沒有和其他類以及數據庫類型保持一致,應該是給該類有關id類型都是設定為long類型,但是該學員在該類中給其中cust_id設定了String類型,就導致後臺程序一致報錯
解決方案: 重新修改cust_id類型,修改成Long類型,把後臺其余的java類中和與此id匹配相關的類型 都由string修改成Long類型,問題可以解決

異常二十三

異常描述: 棧內存溢出異常:由於使用單元測試,所報的異常無法復制,所有截圖,異常名稱已經寫出。

異常二十四

異常描述: 屬性入口創建異常: Error during managed flush [object references an unsaved transient instance - save the transient instance before flushing: cn.itcast.entity.LinkMan]

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: cn.itcast.entity.LinkMan


異常原因: 瞬時對象不能直接update或delete ,只有save可以將瞬時變成持久態對象
解決方案: 先用save把瞬時對象變成持久對象

Hibernate 異常總結