繁体   English   中英

以编程方式配置Hibernate-无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

[英]Configuring Hibernate programmatically - Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

我想用以下代码以编程方式创建一个新的SessionFactory:

    private static void createSessionFactory() {
    try {
        Configuration conf = new Configuration();
        conf.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
        conf.setProperty("hibernate.connection.url", "jdbc:mysql://localhost:3306/database?zeroDateTimeBehavior=convertToNull");
        conf.setProperty("hibernate.connection.username", "root");
        conf.setProperty("hibernate.connection.password", "toor");
        conf.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
        conf.setProperty("hibernate.show_sql", "false");
        conf.setProperty("hibernate.hbm2ddl.auto", "update");
        conf.setProperty("hibernate.current_session_context_class", "thread");
//Added 2 annotated classes.
        conf.addAnnotatedClass(webtest.Category.class)
                .addAnnotatedClass(webtest.Question.class)
        SessionFactory.sessionFactory = conf.buildSessionFactory();
    } catch (HibernateException excp) {
        System.out.println("Error: " + excp);
    }
}

在最后一行( SessionFactory.sessionFactory = conf.buildSessionFactory() ),应用程序将抛出:

Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

Mysql服务器工作正常,日志和密码都可以。 我检查了.JARs,我认为一切都很好。

谢谢。

-------编辑新数据--------我添加了Hibernate日志输出:

jul 24, 2017 7:41:08 PM org.hibernate.Version logVersion INFO: HHH000412: 
Hibernate Core {5.2.10.Final} jul 24, 2017 7:41:08 PM  
org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties 
not found

一旦执行第一行:

Configuration conf = new Configuration();

----------------用堆栈编辑----------

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
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:271)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:233)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:51)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:242)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.handleTypes(MetadataBuildingProcess.java:352)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:111)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:418)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:87)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:691)
    at bbddgestor.SessionFactory.createSessionFactory(SessionFactory.java:52)
    at bbddgestor.SessionFactory.<clinit>(SessionFactory.java:19)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at bbddgestor.BBDDController.openSession(BBDDController.java:30)
    at main.Main.JSONCONSULTADOR(Main.java:52)
    at main.Main.main(Main.java:47)
Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:105)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:123)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:41)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:58)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.addConnections(PooledConnections.java:123)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:42)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections.<init>(PooledConnections.java:20)
    at org.hibernate.engine.jdbc.connections.internal.PooledConnections$Builder.build(PooledConnections.java:161)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.buildPool(DriverManagerConnectionProviderImpl.java:109)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:72)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:94)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:242)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:210)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.buildJdbcConnectionAccess(JdbcEnvironmentInitiator.java:145)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:66)
    at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:259)
    ... 19 more
Caused by: java.sql.SQLException: The server time zone value 'Hora de verano romance' 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.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:545)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:505)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:479)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:489)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:69)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1606)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:633)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:347)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:38)
    ... 34 more
Caused by: com.mysql.cj.core.exceptions.InvalidConnectionAttributeException: The server time zone value 'Hora de verano romance' 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.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:73)
    at com.mysql.cj.jdbc.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:118)
    at com.mysql.cj.mysqla.MysqlaSession.configureTimezone(MysqlaSession.java:293)
    at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:2399)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1739)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1596)
    ... 38 more

-------用POM.XML编辑-------

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.webtest</groupId>
    <artifactId>GestorBBDD</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.10.Final</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->

        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
            <version>6.0.3</version> 
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.8.1</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.javax.persistence</groupId>
            <artifactId>hibernate-jpa-2.1-api</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.8.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-osgi</artifactId>
            <version>5.0.8.Final</version>
        </dependency>
    </dependencies>

</project>

请尝试使用更新版本的MYSQL或至少更改您的MYSQL jar版本

 <dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql-connector-java</artifactId> 
    <version>6.0.3</version> 
    </dependency> 

在格式化所有内容并重新安装计算机时,我没有注意到MySQL版本,而是下载了最后一个可用的版本。

我克隆了我的项目并开始犯错。 我遇到了同样的错误,并遵循约瑟夫建议的步骤。

我将在这里尝试查找事实,看看是否有人可以提供帮助。

这是第一个:

Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver # connect

我想了一下,司机的问题。 我没有连接本地“ jdbc:mysql:// localhost:3306 / mydb ”,而是尝试连接到另一台PC,将连接URL更改为“ jdbc:mysql://192.168.1.5:3306 / mydb ”,但出现错误:

Host is not allowed to connect to this mysql server

我正在更新mysql连接器版本。 我从6.03开始,然后是6.0.6,依此类推。 根据( https://github.com/dbeaver/dbeaver/issues/1042 ),我能够确定此新版本使用了强大的密码系统。

由于已经安装了我,所以我选择删除root用户并再次添加它,但是根据https://www.spigotmc.org/threads/mysql-errors-unable ,通过命令行并使用默认密码系统-to-load-authentication-plugin-caching_sha2_password.304616 /

更新连接器时,我必须将“ hibernate.connection.driver_class”属性更新为“ com.mysql.cj.jdbc.Driver”

这样,又出现了一些错误:

Caused by: java.sql.SQLException: Unknown system variable 'query_cache_size'

然后,我将Maven升级到了最新版本的连接器。 他继续提出错误:

Caused by: java.lang.ClassNotFoundException: Could not load requested class: com.mysql.jdbc.Driver

Hibernate-ClassNotFoundException:com.mysql.jdbc.Driver之后 ,我添加了一个外部JAR。

最后,即使是时区也出现了问题

The server time zone value 'official time of Brazil' is unrecognized or represents more than one time zone. You must configure either the server or the JDBC driver (via the serverTimezone configuration property) to use a specific time zone value if you want to use time zone support.

有了这里的提示https://en.stackoverflow.com/questions/128873/erro-ao-execute-hibernate我更改了连接URL,终于可以了。

Opera摘要:

更改的属性

public class HibernateConnector {

    private static HibernateConnector me;
    private Configuration cfg;
    private SessionFactory sessionFactory;

    private HibernateConnector () throws HibernateException {

        cfg = new Configuration ();
      
        cfg.setProperty ("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
        cfg.setProperty ("hibernate.connection.url", "jdbc: mysql: // localhost: 3306 / mydatabase? useTimezone = true & serverTimezone = UTC");
        cfg.setProperty ("hibernate.connection.username", "root");
        cfg.setProperty ("hibernate.connection.password", "myPassword");
        cfg.setProperty ("hibernate.show_sql", "true");
        cfg.setProperty ("hibernate.hbm2ddl.auto", "update");

        cfg.addAnnotatedClass (myPackage.MyClass.class);

        sessionFactory = cfg.buildSessionFactory ();
    }
}

外部JAR已添加。 [EDIT]项目运行后,我删除了JAR并正常工作。[/ EDIT]

POM.xml中的E

<dependency>
<groupId> mysql </groupId>
<artifactId> mysql-connector-java </artifactId>
<version> 8.0.11 </version>
</dependency>

因此,它起作用了。 我希望它可以帮助某人。

这是MYSQL和C / J(mysql-connector-java)之间的版本兼容问题

尝试升级您的C / J。 您可以在这里参考具体版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM