org.hibernate.AssertionFailure: null id in cn.allo

[framework] 2008-08-02 13:34:53,046 - org.apache.struts.action.RequestProcessor -10674171 [TP-Processor6] WARN org.apache.struts.action.RequestProcessor - Unhandled Exception thrown: class org.hibernate.AssertionFailure
[framework] 2008-08-02 13:35:02,937 - org.hibernate.AssertionFailure -10684062 [TP-Processor6] ERROR org.hibernate.AssertionFailure - an assertion failure occured (this may indicate a bug in Hibernate, but is more likely due to unsafe use of the session)
org.hibernate.AssertionFailure: null id in cn.allobject.db.AReview entry (don't flush the Session after an exception occurs)
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:48)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:150)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:106)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:195)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:954)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1526)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
at cn.allobject.daoimp.OperateColumnDaoImp.showColumn(OperateColumnDaoImp.java:78)
at cn.allobject.struts.action.ShowArticleAction.execute(ShowArticleAction.java:59)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164)
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141)
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90)
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:417)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at cn.java1995.filter.GZipFilter.doFilter(GZipFilter.java:38)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at cn.allobject.servlet.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Unknown Source)

很是奇怪的问题..
这个报AReview类的错误.
有人说这是因为保存对象的时候,数据库默认为空的字段,在hibernate的配置文件中设置了not-null="true"

但我的没有这个问题
<think>好的,用户遇到了Java连接MySQL时出现的SQLNonTransientConnectionException,具体错误是Public Key Retrieval is not allowed。我需要根据提供的引用资料来整理解决方案。 首先,看引用1提到,这是MySQL 8.x版本的常见问题,因为公钥检索不允许。引用2和4、5都建议在连接URL中添加allowPublicKeyRetrieval=true参数,同时可能还需要调整SSL设置。用户可能需要修改数据库连接字符串。 然后,引用3解释说这是因为JDBC驱动无法通过公钥检索获取SSL证书,尤其是在高版本MySQL中。所以解决方案应该包括允许公钥检索,可能禁用SSL(虽然不推荐生产环境),或者更新驱动。 接下来,需要分步骤说明解决方法。首先,修改连接URL,添加参数allowPublicKeyRetrieval=true,并检查useSSL的设置,可能设为false。同时,确保时区配置正确,比如serverTimezone=UTC。此外,检查驱动版本,确保使用最新版本兼容MySQL 8。 另外,需要考虑安全风险,提醒用户allowPublicKeyRetrieval=true可能存在安全隐患,建议仅在测试环境使用,生产环境应正确配置SSL。同时,确认用户名和密码正确,以及数据库服务是否运行正常。 可能的问题还有用户是否遗漏了其他必要参数,比如useUnicode或characterEncoding,这些在引用5中有提到,需要一并检查。最后,生成相关问题帮助用户进一步排查,比如SSL配置、其他连接参数或驱动更新等。</think>### 解决方案:Public Key Retrieval is not allowed 错误处理 #### 错误原因 该错误表明JDBC驱动在连接MySQL 8.x及以上版本时,无法通过公钥检索方式获取服务器的SSL证书。通常由以下原因导致: 1. MySQL服务器默认禁止公钥检索,但客户端未显式允许此操作[^3]; 2. 未正确配置SSL连接参数[^2]; 3. JDBC驱动版本与MySQL服务器版本不兼容。 --- #### 解决步骤 1. **修改数据库连接URL** 在连接字符串中添加 `allowPublicKeyRetrieval=true` 参数,并禁用SSL(适用于测试环境)或启用SSL(生产环境需配置证书): ```java // 示例(测试环境) jdbc:mysql://localhost:3306/db_name?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true ``` - `useSSL=false`:临时禁用SSL(仅建议测试使用)[^2][^4]; - `serverTimezone=UTC`:统一时区避免时间戳错误[^5]; - `allowPublicKeyRetrieval=true`:允许公钥检索。 2. **检查驱动版本** 确保使用支持MySQL 8.x的JDBC驱动(推荐 `mysql-connector-java 8.0.25+`)。 3. **验证用户名和密码** 确认连接参数中的用户名和密码与数据库授权信息一致。 4. **重启服务** 修改配置后,重启应用程序和MySQL服务。 --- #### 注意事项 - **安全风险**:`allowPublicKeyRetrieval=true` 可能暴露敏感信息,生产环境建议启用SSL并配置有效证书。 - **驱动兼容性**:低版本驱动(如5.x)可能导致连接问题,需升级至8.x版本[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值