天天看點

HIbernate常見異常(轉載)

SSH階段常見的異常系列之一hibernate(15條)

異常一

異常一

異常描述: 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: or[email protected]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.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的時候調用方法的時候報空指針異常。

解決方案: 将代碼改為: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中要引入映射檔案,即

即找不到映射檔案。

解決方案: 修改配置檔案的路徑.這樣就可以加載到

映射配置檔案。

繼續閱讀