2017-07-06 10 views
1

MySQL Server 5.7.18(Java 8、ojdbc8)への接続に問題があり、Hibernate 5とJPAにアップグレードしています。コマンドラインからmysqlを使用すると、データベースに接続してアクセスするだけで、サーバーが稼働していることがわかり、ユーザー/パスワードが正しいことがわかります。 PeopleEntity.classは、マッピングファイルではなくアノテーションを使用します。Hibernate 5とJPAを使用してMySQLサーバに接続する際にエラーが発生しました

例外は「要求されたサービス[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]を作成できません」です。私は "jdbc:oracle:thin:@localhost:3306:TestHibernate"と "jdbc:mysql:// localhost:3306/TestHibernate"を試しました。

問題を修正する方法についてのご意見はありがとうございます。

のpom.xmlからのpersistence.xml

<persistence 
    xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
    version="2.1"> 

    <persistence-unit 
     name="PeopleEntity" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <class>com.billsdesk.util.hibernate.tests.PeopleEntity</class> 
     <properties> 
      <property 
       name="hibernate.connection.driver_class" 
       value="com.mysql.jdbc.Driver"></property> 
      <property 
       name="javax.persistence.jdbc.driver" 
       value="oracle.jdbc.OracleDriver"></property> 
      <property 
       name="hibernate.dialect" 
       value="org.hibernate.dialect.MySQL5Dialect" /> 

      <!-- URL, user, and password are passed as properties --> 

     </properties> 
    </persistence-unit> 
</persistence> 

から

final Map<String, String> properties = new HashMap<String, String>(); 
properties.put("javax.persistence.jdbc.user", LoginInfo.getLoginInfo().getUsername()); 
properties.put("javax.persistence.jdbc.password", LoginInfo.getLoginInfo().getPassword()); 
properties.put("javax.persistence.jdbc.url", "jdbc:oracle:thin:@localhost:3306:TestHibernate"); 
// or 
properties.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/TestHibernate"); 
try { 
    Persistence.createEntityManagerFactory("PeopleEntity", properties); 
} catch (final PersistenceException error) { 
    Logger.error(getClass(), error.getMessage()); 
} 

<dependencies> 

    <!-- Hibernate --> 

    <dependency> 
     <groupId>com.oracle.jdbc</groupId> 
     <artifactId>ojdbc8</artifactId> 
     <version>12.2.0.1</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>6.0.6</version> 
    </dependency> 

    <!-- 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/org.hibernate/hibernate-entitymanager --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>5.2.10.Final</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api --> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0.2</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.8.2</version> 
    </dependency> 
</dependencies> 

Hibernateは、MySQLはオラクルの製品であるという事実にもかかわらず

14:00:45.861 [main] INFO org.hibernate.Version - HHH000412: Hibernate Core {5.2.10.Final} 
14:00:45.862 [main] INFO org.hibernate.cfg.Environment - HHH000206: hibernate.properties not found 
14:00:45.910 [main] INFO org.hibernate.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {5.0.1.Final} 
14:00:46.088 [main] WARN org.hibernate.orm.connections.pooling - HHH10001002: Using Hibernate built-in connection pool (not for production use!) 
14:00:46.127 [main] INFO org.hibernate.orm.connections.pooling - HHH10001005: using driver [oracle.jdbc.OracleDriver] at URL [jdbc:oracle:thin:@localhost:3306:TestHibernate] 
14:00:46.127 [main] INFO org.hibernate.orm.connections.pooling - HHH10001001: Connection properties: {user=sa, password=****} 
14:00:46.128 [main] INFO org.hibernate.orm.connections.pooling - HHH10001003: Autocommit mode: false 
14:00:46.130 [main] INFO org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl - HHH000115: Hibernate connection pool size: 20 (min=1) 
2017-07-06 14:00:46 SEVERE Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] 

答えて

0

をトレース株式会社、 "Oracle"データベース製品と "MySQL"データベース製品は2つの非常に異なる生き物です。 "Oracle" JDBCドライバを使用することは決してMySQLデータベースサーバでは動作しません。

最小限の実装として、私はちょうど4つのファイルで作業するために以下を得ました。それは "最高の"または最も "現代的な"方法ではないかもしれませんが、それは私にとってはうまくいったのです。

のpom.xml

<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.example.demo</groupId> 
    <artifactId>so44959525</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <dependencies> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>5.2.10.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>6.0.6</version> 
    </dependency> 
    </dependencies> 
</project> 

のsrc /メイン/リソース/ hibernate.cfg.xmlの

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 

    <session-factory> 

     <!-- Database connection properties --> 
     <property name="connection.url">jdbc:mysql://localhost:3307/mydb</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">whatever</property> 
     <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 

     <!-- 
     Automatic schema generation. Possible values: 

     none (default value), create-only, drop, create, create-drop, validate, and update 

     https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-hbmddl 
     --> 
     <property name="hbm2ddl.auto">create</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <property name="format_sql">false</property> 

     <mapping class="com.example.demo.Person"/> 

    </session-factory> 

</hibernate-configuration> 

のsrc /メイン/ javaの/ COM /例/デモ/人.java

package com.example.demo; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Person { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 
    public int getId() { return id; } 

    private String name; 
    public String getName() { return name; } 
    public void setName(String name) { this.name = name; } 

    public Person() { 
     // no-argument constructor required by Hibernate 
    } 

    public Person (String name) { 
     this.name = name; 
    } 
} 

のsrc /メイン/ javaの/ COM /例/デモ/ DemoMain.java

package com.example.demo; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.hibernate.boot.MetadataSources; 
import org.hibernate.boot.registry.StandardServiceRegistry; 
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; 

public class DemoMain { 

    public static void main(String[] args) { 
     final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() 
       .configure() // configures settings from hibernate.cfg.xml 
       .build(); 
     try (SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory()) { 
      Session session = sessionFactory.openSession(); 
      session.beginTransaction(); 
      for (String newGuy : new String[] { "Rodd", "Todd" }) { 
       int newId = (int) session.save(new Person(newGuy)); 
       System.out.printf("\"%s\" inserted as id %d%n", newGuy, newId); 
      } 
      session.getTransaction().commit(); 
      session.close(); 
     } catch (Exception e) { 
      e.printStackTrace(System.err); 
     } finally { 
      StandardServiceRegistryBuilder.destroy(registry); 
     } 
    } 

} 
+0

おかげでたくさん。私はそのようなものでなければならないと考えました。私はあなたの例を使用するので、私はまだ私のhibernate.cfg.xmlファイルを持っています。 –

+0

私はタイムゾーンの問題に関してエラーが発生していたので、mysqlを5.1.39にダウングレードしなければなりませんでした。それ以外はすべて良いです。再度、感謝します。 –

関連する問題