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");
}
};
}
}
私はここで何をしていますか?
最初にあなたの設定をすべて削除してください。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;
}
}
そのようにあなたはEntityManagerFactory
とSessionFactory
の両方を持っています。
@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
依存関係を削除することもお勧めします。
データベースサーバを停止した状態で(Spring Bootを使用して) アプリケーションを起動したときに、私は同様の問題に直面していました 。
Hibernateは自動的に使用する正しい方言を決定できますが、これを行うにはデータベースへのライブ接続が必要です。
データベースが作成されなかったときにこのエラーが発生しました。手動でDBを作成した後、それはうまくいきました。
私も同様の問題に直面しました。しかし、それは提供された無効なパスワードが原因でした。また、あなたのコードは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=
application.propertiesファイルにspring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
を追加する
私は同じ問題に遭遇し、私の問題は私が接続しようとしていたDBが存在しないということでした。
私はDBを作成し、URL /接続文字列を確認して再実行しましたが、すべてが期待通りに動作しました。
あなたのapplication.properties
がすべて正しい情報を持っていることを確認してください:(私のdbポートを8889
から3306
に変更しました)
db.url: jdbc:mysql://localhost:3306/test
コードがデータベースに接続できないため、これが発生しています。 mysqlドライバーとユーザー名、パスワードが正しいことを確認してください。
OPがそうであったようにあなたがあなたのデータベースにあなたのデータベースがあることを確認してください。それが私の問題でした。
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");
}
}
私の場合、ユーザーはデータベースに接続できませんでした。ログに例外の直前に警告が含まれている場合も、同じ問題が発生します。
WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.
私の問題は、組み込みデータベースがすでに接続されているということでした。接続を閉じる
EclipseがJDBCドライバーを見つけることができなかったとき、私はこの問題を得ました。この作業をするためにEclipseからグラドルリフレッシュをしなければなりませんでした。
私もこの問題を抱えていました。私の場合は、MySQLユーザーに付与されていないためです。私のアプリが使用しているMySQLユーザーに権限を割り当てることで問題は解決しました。
grant select, insert, delete, update on my_db.* to 'my_user'@'%';
セッションを開始する前にconf.configure();
を追加しなかったので、これは私に起こりました:
Configuration conf = new Configuration();
conf.configure();
私は同じ問題に直面しました:私が接続しようとしていたデータベースが存在しませんでした。私はjpa.database=default
を使用しました(これはデータベースに接続してから方言を自動選択しようとすることを意味します)。データベースを起動すると、何の変更もなく正常に動作しました。
ログの上記のエラーがこれだった場合: "ERROR - HikariPool-1 - driverClassNameにはjdbcUrlが必要です"そして解決策はこれに従って "url"を "jdbc-url"に書き換えることです: データベースapplication.yml for Spring boot applications.propertiesから
休止状態のコード生成を使用した後に同じエラーが発生しました
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/ /
それからhibernate.cfg.xml
は/src/main/Java
に作成されましたが、それを削除した後は接続パラメータなしで - 私の問題は解決しました
私は同じ問題を抱えていました、そしてそれはデータベースインスタンスに接続することができないことによって引き起こされました。そのエラーの上のログで休止状態エラーHHH000342を探してください、それはあなたにdb接続が失敗しているところへの考えを与えるべきです(不正確なusername/pass、urlなど)。
AWS MySQL RDSを使用している場合は、データベースに接続できないときに発生することがあります。 MySQL RDSのAWSセキュリティグループ設定に移動し、MyIPを更新してインバウンドIPルールを編集します。
私はこの問題に直面しました、そして、上記をすることは私のために問題を直しました。
application.properties に有効な詳細を入力したこと、およびデータベースサーバーが使用可能かどうかを確認してください。例としてMySQLに接続しているときは、 _ xampp _ が正しく動作しているかどうかを確認してください。
同じですが 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がないことを確認してください...
この行を使用している場合
sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));
env.getProperty("hibernate.dialect")
がnullではないことを確認してください。
私はMysql 8.0.11のバージョンを5.7に戻すことが原因でこの問題に直面しました
私は同じ問題を抱えていたし、デバッグ後にSpringのapplication.propertiesにDBサーバーのIPアドレスが間違っていたことがわかりました
spring.datasource.url=jdbc:Oracle:thin:@WRONG:1521/DEV