解决Hibernate报错The server time zone value is unrecognized or represents more than one time zone

£神魔★判官ぃ 2021-09-25 03:00 448阅读 0赞

解决Hibernate报错The server time zone value is unrecognized or represents more than one time zone

  笔者在使用Hibernate做代码重构的时候,运行时一直报同一个错误。当时笔者的运行环境如下:

笔者报错时的运行环境:
JDK 13.0.2
MySQL 8.0.21
Hibernate 5.4.25 Final Release
IntelliJ IDEA 2020.1.2 (Ultimate Edition)

  这个报错的信息如下:(这个报错信息居然还有乱码)

  1. ERROR: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
  2. Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
  3. at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
  4. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
  5. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
  6. at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
  7. at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
  8. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
  9. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
  10. at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:176)
  11. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127)
  12. at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:86)
  13. at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
  14. at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
  15. at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
  16. at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
  17. at lee.NewsManager.main(NewsManager.java:30)
  18. Caused by: org.hibernate.exception.GenericJDBCException: Error calling Driver#connect
  19. at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
  20. at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
  21. at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:118)
  22. at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
  23. at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
  24. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.addConnections(DriverManagerConnectionProviderImpl.java:341)
  25. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:260)
  26. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections.<init>(DriverManagerConnectionProviderImpl.java:238)
  27. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections$Builder.build(DriverManagerConnectionProviderImpl.java:379)
  28. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:98)
  29. at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:73)
  30. at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:107)
  31. at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:246)
  32. at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
  33. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
  34. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
  35. at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
  36. at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
  37. at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
  38. ... 14 more
  39. Caused by: java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
  40. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
  41. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
  42. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
  43. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
  44. at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
  45. at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
  46. at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
  47. at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
  48. at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
  49. at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
  50. at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
  51. ... 29 more
  52. Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
  53. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
  54. at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
  55. at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
  56. at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500)
  57. at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
  58. at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
  59. at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
  60. at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132)
  61. at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120)
  62. at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143)
  63. at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310)
  64. at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967)
  65. at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
  66. ... 33 more

  这是因为自MySQL 6.0之后,connection.url对应的内容必须加上serverTimezone参数(比如serverTimezone=UTC)。笔者原来的配置片段如下:

  1. <property name="connection.url">jdbc:mysql://localhost/hibernate?useSSL=true</property>

  而自MySQL 6.0之后,这要改成:

  1. <property name="connection.url">jdbc:mysql://localhost/hibernate?useSSL=true&serverTimezone=UTC</property>

发表评论

表情:
评论列表 (有 0 条评论,448人围观)

还没有评论,来说两句吧...

相关阅读