org.hibernate.HibernateException:「hibernate.dialect」が設定されていない場合、DialectResolutionInfoへのアクセスはnullにできません


205

spring-jpaを介してhibernateを使用するspring-bootアプリケーションを実行しようとしていますが、次のエラーが発生します。

Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
        at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104)
        at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
        at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205)
        at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
        at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
        at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
        ... 21 more

私のpom.xmlファイルはこれです:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.8.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
       </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
    </dependency>
</dependencies>

私の休止状態の構成は次のとおりです(方言構成はこのクラスの最後のメソッドにあります)。

@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.spring.app" })
public class HibernateConfig {

   @Bean
   public LocalSessionFactoryBean sessionFactory() {
      LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

      sessionFactory.setDataSource(restDataSource());
      sessionFactory.setPackagesToScan(new String[] { "com.spring.app.model" });
      sessionFactory.setHibernateProperties(hibernateProperties());

      return sessionFactory;
   }

   @Bean
   public DataSource restDataSource() {
      BasicDataSource dataSource = new BasicDataSource();

      dataSource.setDriverClassName("org.postgresql.Driver");
      dataSource.setUrl("jdbc:postgresql://localhost:5432/teste?charSet=LATIN1");
      dataSource.setUsername("klebermo");
      dataSource.setPassword("123");

      return dataSource;
   }

   @Bean
   @Autowired
   public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
      HibernateTransactionManager txManager = new HibernateTransactionManager();
      txManager.setSessionFactory(sessionFactory);
      return txManager;
   }

   @Bean
   public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
      return new PersistenceExceptionTranslationPostProcessor();
   }

   Properties hibernateProperties() {
      return new Properties() {
         /**
         * 
         */
        private static final long serialVersionUID = 1L;

        {
            setProperty("hibernate.hbm2ddl.auto", "create");
            setProperty("hibernate.show_sql", "false");
            setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
         }
      };
   }
}

ここで私が間違っていることは何ですか?

回答:


201

まず、すべての構成を削除します。SpringBootが構成を開始します。

application.propertiesクラスパスにがあることを確認し、次のプロパティを追加します。

spring.datasource.url=jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username=klebermo
spring.datasource.password=123

spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create

あなたが本当ににアクセスする必要がある場合SessionFactory、それは同じデータソースのため、基本的には、あなたは(も文書化されて次の操作を行うことができ、ここで JavaConfigは、XML用がないし)。

@Configuration        
public class HibernateConfig {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

そうすれば、EntityManagerFactoryとの両方を使用できますSessionFactory

更新: Hibernate 5以降、はSessionFactory実際にを拡張していEntityManagerFactoryます。したがって、を取得するSessionFactoryには、にキャストするEntityManagerFactoryか、unwrapメソッドを使用して取得します。

public class SomeHibernateRepository {

  @PersistenceUnit
  private EntityManagerFactory emf;

  protected SessionFactory getSessionFactory() {
    return emf.unwrap(SessionFactory.class);
  }

}

Spring Bootによって有効化されるため、アノテーションを必要としないmainメソッドを持つクラスがあると仮定します。パッケージ内の基本的なアプリケーションクラスで十分です。@EnableAutoConfiguration@EnableTransactionManagementcom.spring.app

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

} 

このようなもので、すべてのクラス(エンティティとSpring Dataベースのリポジトリを含む)が検出されます。

更新:これらの注釈は@SpringBootApplication、Spring Bootのより新しいバージョンで単一のものに置き換えることができます。

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
} 

またcommons-dbcp、Spring Bootがより高速で堅牢なHikariCP実装を構成できるようにするため、依存関係を削除することをお勧めします。


1
しかし、このファイルを作成しないようにする方法はありますapplication.propertesか?私はHibernateConfigクラスですべての構成を行う方法を好みます。
Kleber Mota

2
どうして?Spring Bootの目的は、自動構成を行うことです...したがって、プロパティファイルに7行を超える詳細なJava構成を含めることをお勧めします。
M. Deinum 2014年

2
プロパティファイルでは6行になる場合もあります。ブートがSpring.datasource.urlから推論するため、Postgresを使用している場合は、spring.datasource.driverClassNameを設定する必要はありません。
アンディウィルキンソン

2
@AlexWordenいいえ、そうではありません...ランダムなコメントを付ける代わりに、プロパティのロード方法、特にSpring Bootのサポートを最初に読みたい場合があります。ファイルの権利を直接設定する場合、ディスク上のパスワードは問題である必要はありません。それらをデータベースに
入れること

4
3つの注釈、つまりConfiguration、EnableAutoConfiguration、ComponentScanを使用する代わりに。SpringBootApplicationアノテーションを使用できます
Pankaj

159

データベースサーバーを停止した状態で(Spring Bootを使用して)アプリケーションを起動すると、同様の問題に直面していまし

Hibernateは自動的に使用する正しい方言を決定できますが、これを行うには、データベースへのライブ接続が必要です。


2
サーバー上のpg_hba.confがリモート接続用に構成されておらず、このエラーが発生したという点で、私の問題はこれと同様でした。
ブライアン

8
接続しようとしているデータベースが存在しない場合も、このエラーが表示されます。
Jonas Pedersen

12
同じ問題が発生しました。私の場合、DBは稼働していますが、資格情報が間違っていました。+1
フェデリコ

驚いたことに、hbm2ddl.auto = trueを期待してスキーマを削除するとデータベースとテーブルが作成されるときに、この問題が発生し始めました。しかし、それは失敗しました。しかし、私は空のスキーマを作成しましたhbm2ddlはテーブルの作成に取り組みました
Saurabh

データベースマシンのIPは変更されましたが、DNSは古いものに解決されていました:-(
Illidan

24

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectapplication.propertiesファイルに追加


これは素晴らしい答えです。データベースクラスにMockBeanを使用し、プロパティプロファイルに実際の接続情報を含めることができません
Taylor

spring.jpa.properties.hibernate.dialectをapplication.propertiesに追加すると役に立ちました。ありがとう)
Maks

22

データベースが作成されていないときにこのエラーが発生しました。DBを手動で作成した後、正常に動作しました。


1
通常、「spring.jpa.hibernate.ddl-auto = create」を使用すると、手動での作成を回避できます
Andrei

@Andrei-どのように/どこで「spring.jpa.hibernate.ddl-auto = create」を指定しますか?
Alex Worden

2
@ AlexWorden、Andreiは、Spring Bootであれば、application.propertiesに配置できることを意味しました。xmlベースのSpring構成に相当するものが必要です。
ACV 2016

このエラーは、データベースが存在しない場合、またはデータベース内のテーブルが存在しない場合にのみ表示されますか?
zygimantus 2017

1
間違ったパスワードを入力していて、同じエラーに直面していました。ACVありがとう、あなたは私をたくさん助けてくれました。
santu 2017

17

私も同様の問題に直面しました。しかし、それは提供された無効なパスワードが原因でした。また、あなたのコードは、Springを使用した古いスタイルのコードのように思われます。すでにスプリングブートを使用していることを説明しました。つまり、ほとんどのものが自動的に構成されます。hibernateダイアレクトは、クラスパスで使用可能なDBドライバーと、接続を適切にテストするために使用できる有効な資格情報に基づいて自動的に選択されます。接続に問題がある場合、再び同じエラーが発生します。application.propertiesに必要なプロパティは3つのみ

# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1

# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=

8

私は同じ問題に遭遇し、私の問題は、接続しようとしたDBが存在しないことでした。

私はDBを作成し、URL /接続文字列を検証して再実行し、すべてが期待どおりに機能しました。


コメントありがとうございましたが、間違っていた接続ポートを確認するようになりました
Feras

4

これは、データベースに接続するためのコードが必要ないためです。mysqlドライバーとユーザー名、パスワードが正しいことを確認してください。


4

あなたapplication.propertiesがすべて正しい情報を持っていることを確認してください:(私は私のdbポート88893306それが機能するように変更しました)

 db.url: jdbc:mysql://localhost:3306/test

4

jpa java configの春のブートでは、JpaBaseConfigurationを拡張して、その抽象メソッドを実装する必要があります。

@Configuration
public class JpaConfig extends JpaBaseConfiguration {

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        return vendorAdapter;
    }

    @Override
    protected Map<String, Object> getVendorProperties() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    }

}

場合によっては、application.propertiesがプロパティの変更を確認できないことがあります。また、上記のようにproperties.putを追加して正常に機能しました。
fatih yavuz

4

冗長なHibernate構成を削除する

Spring Bootを使用している場合、Spring Bootが自動的に行うことができるため、JPAおよびHibernate構成を明示的に提供する必要はありません。

データベース構成プロパティを追加する

application.properties春のブート・コンフィギュレーション・ファイルは、あなたのデータベースの構成プロパティを追加します:

spring.datasource.driverClassName = "org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username = klebermo
spring.datasource.password = 123

Hibernate固有のプロパティを追加する

また、同じapplication.properties構成ファイルで、カスタムHibernateプロパティを設定することもできます。

# Log SQL statements
spring.jpa.show-sql = false

# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create

# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

それでおしまい!


spring.jpa.properties.hibernate.dialectをapplication.propertiesに追加すると役に立ちました。ありがとう)
Maks

3

同じ問題がありました。これをapplication.propertiesに追加すると、問題が解決しました:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

spring.jpa.properties.hibernate.dialectをapplication.propertiesに追加すると役に立ちました。ありがとう)
Maks

2

私の場合、ユーザーはデータベースに接続できませんでした。例外の直前にログに警告が含まれている場合に同じ問題が発生する場合:

WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.

2

OPと同じように、データベースがpomにあることを確認してください。それが私の問題でした。


さらに詳しく説明できますか?この答えはどういう意味ですか?
Tunaki

mysqlの依存関係を追加する必要があるだけです。
obesechicken13

2

私の問題は、組み込みデータベースがすでに接続されていることでした。接続を閉じる


1
接続に失敗したときにこのエラーを報告するHibernateの問題があることが確認できます。ネットワークのオンとオフを切り替える問題を再現できました。
ボルジャブ2017

2

EclipseがJDBCドライバーを見つけられなかったときに、この問題が発生しました。この作業を行うには、日食からグレードルを更新する必要がありました。


2

hibernate.dialect設定されない問題の理由のいくつかを次に示します。これらの例外のほとんどは、起動ログに表示され、最後に前述の問題が続きます。

例:Postgres DBを備えたSpringブートアプリ

1.データベースが実際にインストールされ、サーバーが起動されているかどうかを確認します。

  • org.postgresql.util.PSQLException:localhost:5432への接続が拒否されました。ホスト名とポートが正しいこと、およびポストマスターがTCP / IP接続を受け入れていることを確認してください。
  • java.net.ConnectException:接続拒否:接続
  • org.hibernate.service.spi.ServiceException:要求されたサービスを作成できません[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

2.データベース名が正しく記述されているかどうかを確認します。

  • org.postgresql.util.PSQLException:FATAL:データベース "foo"は存在しません

    application.properties、ファイル、

    spring.datasource.url = jdbc:postgresql://localhost:5432/foo

    しかしfoo存在しませんでした。そこで、pgAdminからpostgres用のデータベースを作成しました

    CREATE DATABASE foo;

3.ホスト名とサーバーポートにアクセスできるかどうかを確認します。

  • org.postgresql.util.PSQLException:localhost:5431への接続が拒否されました。ホスト名とポートが正しいこと、およびポストマスターがTCP / IP接続を受け入れていることを確認してください。
  • java.net.ConnectException:接続拒否:接続

4.データベースの資格情報が正しいかどうかを確認します。

  • @Pankajが述べたように
  • org.postgresql.util.PSQLException:FATAL:ユーザー「postgres」のパスワード認証に失敗しました

    spring.datasource.username= {DB USERNAME HERE}

    spring.datasource.password= {DB PASSWORD HERE}


1

この行を使用している場合:

sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));

env.getProperty("hibernate.dialect")nullでないことを確認してください。


1

同じですが、JBoss WildFly ASにあります。

私のプロパティで解決 META-INF/persistence.xml

<properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            <property name="spring.jpa.database-platform" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="spring.jpa.show-sql" value="false" />
</properties>

1

AWS MySQL RDSを使用している場合、データベースに接続できないときに発生する可能性があります。MySQL RDSのAWSセキュリティグループ設定に移動し、MyIPを更新してインバウンドIPルールを編集します。

私はこの問題に直面し、上記を実行すると問題が解決しました。


RDS Aurora MySQLのセキュリティグループへのすべてのトラフィックを許可しましたが、これでうまくいきました。uをもっと具体的にしたい、または製品環境にしたい場合は、許可されたIPのみを追加してください
AleksandarT

1

私もこの問題を抱えていました。私の場合、それはMySQLユーザーに割り当てられた権限がないためでした。私のアプリが使用する権限をMySQLユーザーに割り当てると、問題が解決しました:

grant select, insert, delete, update on my_db.* to 'my_user'@'%';

1

同じ問題があり、デバッグした後、Springのapplication.propertiesにDBサーバーのIPアドレスが間違っていることがわかりました

spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV

1

このエラーメッセージは、次の3つの場合に再現されました。

  • application.propertiesファイル、persistence.propertiesファイル、またはHibernateConfigファイルに記述されているユーザー名を持つデータベースユーザーが存在しません
  • デプロイされたデータベースにはそのユーザーがいますが、ユーザーは上記のファイルのいずれかとは異なるパスワードで識別されています
  • データベースにはそのユーザーとパスワードが一致していますが、そのユーザーには、スプリングブートアプリが行うすべてのデータベースタスクを実行するために必要なすべての権限がありません

明らかな解決策は、Spring-Bootアプリと同じユーザー名とパスワードで新しいデータベースユーザーを作成するか、Spring-Bootアプリファイルでユーザー名とパスワードを変更して、既存のデータベースユーザーと一致させ、そのデータベースユーザーに十分な権限を付与することです。MySQLデータベースの場合、これは次のように実行できます。

mysql -u root -p 
>CREATE USER 'theuser'@'localhost' IDENTIFIED BY 'thepassword';
>GRANT ALL ON *.* to theuser@localhost IDENTIFIED BY 'thepassword';
>FLUSH PRIVILEGES;

明らかにPostgresqlにも同様のコマンドがありますが、Postgresqlの場合にこのエラーメッセージがこれら3つのケースで再現できるかどうかはテストしていません。


0

同じ問題があり、データベースインスタンスに接続できないことが原因でした。そのエラーの上のログで休止エラーHHH000342を探します。これにより、db接続が失敗している場所(ユーザー名/パス、URLが正しくないなど)がわかります。


0

これconf.configure();は、セッションを開始する前にを追加していなかったために起こりました。

Configuration conf = new Configuration();
conf.configure();

0

application.propertiesに有効な詳細を入力していること、およびデータベースサーバーが使用可能かどうかを確認してください。MySQLで接続する場合の例として、XAMPPが正しく実行されているかどうかを確認します。


0

私は同じ問題に直面しました:接続しようとしたデータベースが存在しませんでした。私は使用しましたjpa.database=default(つまり、データベースに接続してから方言を自動的に選択しようとすることを意味します)。データベースを起動すると、何の変更もなく正常に機能しました。





0

私は同じエラーがありました、

 Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

私の場合、WARには内部に
application.propertiesがあり、開発サーバーを指していましたが、外部application.propertiesは正しいDBサーバーを指していました。

クラスパス/ jarに他のapplication.propertiesがないことを確認してください...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.