web-dev-qa-db-ja.com

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

Spring-jpaを介して休止状態を使用する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");
         }
      };
   }
}

私はここで何をしていますか?

149
Kleber Mota

最初にあなたの設定をすべて削除してください。Spring Bootはそれを起動します。 SessionFactoryではなくEntityManagerFactoryが本当に必要な場合は、HibernateJpaSessionFactoryBeanを追加してください。

クラスパスに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

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

あなたが本当にSessionFactoryへのアクセスを必要とし、それが基本的に同じデータソースのためであるならば、あなたは次のことをすることができます(これはまた文書化されます here

@Configuration        
public class HibernateConfig {

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

そのようにあなたはEntityManagerFactorySessionFactoryの両方を持っています。

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

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

そのようなことで、すべてのクラス(エンティティやSpring Dataベースのリポジトリを含む)が検出されるのに十分なはずです。

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

156
M. Deinum

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

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

115
mhnagaoka

データベースが作成されなかったときにこのエラーが発生しました。手動でDBを作成した後、それはうまくいきました。

18
ACV

私も同様の問題に直面しました。しかし、それは提供された無効なパスワードが原因でした。また、あなたのコードはspringを使った古いスタイルのコードのようです。あなたはすでにあなたがスプリングブートを使っていると述べた、それは事の大部分があなたのために自動設定されることを意味する。休止状態の方言は、接続を正しくテストするために使用できる有効な認証情報とともに、クラスパスで利用可能な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=
14
Pankaj

application.propertiesファイルにspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectを追加する

13
alpine

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

私はDBを作成し、URL /接続文字列を確認して再実行しましたが、すべてが期待通りに動作しました。

6
Eric B.

あなたのapplication.propertiesがすべて正しい情報を持っていることを確認してください:(私のdbポートを8889から3306に変更しました)

 db.url: jdbc:mysql://localhost:3306/test
3
Vikram S

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

3
user7169604

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

2
obesechicken13

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");
    }

}
2
Yaroslav

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

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

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

2
doesnt_matter

EclipseがJDBCドライバーを見つけることができなかったとき、私はこの問題を得ました。この作業をするためにEclipseからグラドルリフレッシュをしなければなりませんでした。

1

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

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

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

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

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

0
Avishekh Tewari

ログの上記のエラーがこれだった場合: "ERROR - HikariPool-1 - driverClassNameにはjdbcUrlが必要です"そして解決策はこれに従って "url"を "jdbc-url"に書き換えることです: データベースapplication.yml for Spring boot applications.propertiesから

0
JanBrus

休止状態のコード生成を使用した後に同じエラーが発生しました

https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/ /

それからhibernate.cfg.xml/src/main/Javaに作成されましたが、それを削除した後は接続パラメータなしで - 私の問題は解決しました

0
RMagen

私は同じ問題を抱えていました、そしてそれはデータベースインスタンスに接続することができないことによって引き起こされました。そのエラーの上のログで休止状態エラーHHH000342を探してください、それはあなたにdb接続が失敗しているところへの考えを与えるべきです(不正確なusername/pass、urlなど)。

0
Farouk

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

私はこの問題に直面しました、そして、上記をすることは私のために問題を直しました。

0
Ajitesh

application.properties に有効な詳細を入力したこと、およびデータベースサーバーが使用可能かどうかを確認してください。例としてMySQLに接続しているときは、 _ xampp _ が正しく動作しているかどうかを確認してください。

0
Lahiru Gamage

同じですが 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>

同じエラーが発生しましたが、

 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がないことを確認してください...

0
user648026

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

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

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

0
zygimantus

私はMysql 8.0.11のバージョンを5.7に戻すことが原因でこの問題に直面しました

0
Gautam Yadav

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

spring.datasource.url=jdbc:Oracle:thin:@WRONG:1521/DEV
0
user648026