- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在运行 2.1.4.RELEASE 版本的 spring boot 应用程序。该应用程序使用 hibernate 5.4.2.Final 和 postgresql 驱动程序版本 42.2.5。最近我试图从 hibernate 中生成 DDL 以查看 DDL,但我偶然发现了一个困扰我几天的错误。使用PostgreSQL 11.2版本(Ubuntu 11.2-1.pgdg18.04+1)
现在,当应用程序启动时,它每次都会遇到该异常。
如果我在方法上放置一个断点
org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver.determineAppropriateResolverDelegate(Connection connection)
我看到异常发生的地方,即在点
connection.getSchema();
这个类有帮助的评论
unfortunately Connection#getSchema is only available in Java 1.7 and above
and Hibernate still baselines on 1.6. So for now, use reflection and
leverage the Connection#getSchema method if it is available.
If the JDBC driver does not implement the Java 7 spec, but the JRE is Java 7
then the getSchemaMethod is not null but the call to getSchema() throws an java.lang.AbstractMethodError
好吧,我正在运行 7 以上的版本,即:
java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
我在 spring boot 启动时仍然遇到以下异常,即 !!!!甚至在代码(BEANS)部分到达之前!应该生成 DDL,即方法 createSchemaWithHibernate5(LocalSessionFactoryBean sessionFactory)。所以这与配置或连接类型有关。当我在连接类型上放置断点时,我看到它是类型
org.apache.commons.dbcp.PoolableConnection
好吧,一个是从“DelegatingConnection”扩展而来的,虽然它扩展了接口(interface),但它没有实现方法 getSchema()
java.sql.Connection
它确实有方法 getSchema()。我完全不确定这应该如何工作,因为这些都不是最终类或抽象类。
我还看到还有一个类叫
org.postgresql.jdbc.PgConnection.
我怎么能强制我的应用程序使用这个,因为我看到这个确实实现了方法 getSchema()。
这是我遇到的异常:
2019-04-17 10:06:42.487 DEBUG tito-pc --- [ restartedMain] .i.f.i.DefaultIdentifierGeneratorFactory : Registering IdentifierGenerator strategy [enhanced-table] -> [org.hibernate.id.enhanced.TableGenerator]
2019-04-17 10:06:43.004 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : Database ->
name : PostgreSQL
version : 11.2 (Ubuntu 11.2-1.pgdg18.04+1)
major : 11
minor : 2
2019-04-17 10:06:43.004 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : Driver ->
name : PostgreSQL JDBC Driver
version : 42.2.5
major : 42
minor : 2
2019-04-17 10:06:43.005 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : JDBC version : 4.2
2019-04-17 10:06:43.023 INFO tito-pc --- [ restartedMain] o.h.d.Dialect : HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL95Dialect
2019-04-17 10:06:43.053 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.s.IdentifierHelperBuilder : JDBC driver metadata reported database stores quoted identifiers in neither upper, lower nor mixed case
2019-04-17 10:06:54.515 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.i.DefaultSchemaNameResolver : Unable to use Java 1.7 Connection#getSchema
2019-04-17 10:06:59.058 DEBUG tito-pc --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentImpl : Unable to resolve connection default schema
org.hibernate.HibernateException: Use of DefaultSchemaNameResolver requires Dialect to provide the proper SQL statement/command but provided Dialect [org.hibernate.dialect.PostgreSQL95Dialect] did not return anything from Dialect#getCurrentSchemaCommand
at org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver$SchemaNameResolverFallbackDelegate.resolveSchemaName(DefaultSchemaNameResolver.java:100)
at org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver.resolveSchemaName(DefaultSchemaNameResolver.java:76)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.determineCurrentSchemaName(JdbcEnvironmentImpl.java:311)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.<init>(JdbcEnvironmentImpl.java:266)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:114)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:152)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214)
at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:175)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:83)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:473)
at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:84)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:689)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:615)
at org.springframework.orm.hibernate5.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:599)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
.....
这是我的持久化配置:
@Profile("Development")
@Configuration
@EnableTransactionManagement
@Order(value=1)
public class PersistenceConfigDevelopment {
private static Logger logger = LogManager.getLogger(PersistenceConfigDevelopment.class.getName());
@Bean
@Primary
public org.apache.commons.dbcp.BasicDataSource dataSourceReadWrite1() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/develpmentTestDb");
dataSource.setUsername("admin");
dataSource.setPassword("notABigSecret");
dataSource.setInitialSize(20);
dataSource.setMaxActive(-1);
return dataSource;
}
@Bean
@Primary
public org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory() {
org.springframework.orm.hibernate5.LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setHibernateProperties(hibernateProperties());
sessionFactory.setDataSource(this.dataSourceReadWrite1());
sessionFactory.setPackagesToScan("org.university.");
return sessionFactory;
}
@Bean
public HibernateTransactionManager transactionManager() {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory().getObject());
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
@Bean
public Properties hibernateProperties() {
return new Properties() {
/**
*
*/
private static final long serialVersionUID = 1L;
{
setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL95Dialect");
setProperty("hibernate.chach.provider_class", "org.hibernate.cache.NoCacheProvider");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.hbm2ddl.auto", "create-drop");
setProperty("hibernate.cache.use_second_level_cache", "false");
setProperty("hibernate.cache.use_query_cache", "false");
// isolation level
setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_SERIALIZABLE));
}
};
}
@Bean
public Boolean createSchemaWithHibernate5(LocalSessionFactoryBean sessionFactory) {
final PostgreSQL95Dialect dialect = new PostgreSQL95Dialect();
StandardServiceRegistry serviceRegistry = sessionFactory.getConfiguration().getStandardServiceRegistryBuilder()
.applySetting("hibernate.dialect", dialect)
.build();
Metadata metadata = new MetadataSources(serviceRegistry).buildMetadata();
new SchemaExport()
.setOutputFile("db-schema.hibernate5.ddl")
.create(EnumSet.of(TargetType.SCRIPT), metadata);
metadata.buildSessionFactory().close();
return Boolean.TRUE;
}
}
由于这篇 stackoverflow 帖子,我尝试更改驱动程序,即
Implementating Method org.postgresql.jdbc4.Jdbc4Connection.getSchema()
并尝试使用“postgresql”maven 工件而不是“org.postgresql”,但这也没有帮助。
非常感谢任何帮助。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<!-- <version>${orgpostgresql.version}</version> -->
</dependency>
<!-- <dependency> -->
<!-- <groupId>postgresql</groupId> -->
<!-- <artifactId>postgresql</artifactId> -->
<!-- <version>${postgresql.version}</version> -->
<!-- </dependency> -->
4 月 17 日更新
我能够通过使用另一个数据源(即也将连接器更改为 PgConnection 的 PGSimpleDataSource)摆脱异常,但仍未生成 DDL。 IE。正在生成文件 db-schema.hibernate5.ddl,但它是空的。
@Bean
@Primary
public PGSimpleDataSource dataSourceReadWrite1() {
PGSimpleDataSource dataSource = new PGSimpleDataSource();
dataSource.setUrl("jdbc:postgresql://localhost:5432/developmentTestDB");
dataSource.setUser("admin");
dataSource.setPassword("notABigSecret");
return dataSource;
}
最佳答案
我自己也遇到过同样的问题
11:16:07.675 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - Database ->
name : PostgreSQL
version : 10.18 (Ubuntu 10.18-0ubuntu0.18.04.1)
major : 10
minor : 18
11:16:07.675 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - Driver ->
name : PostgreSQL Native Driver
version : PostgreSQL 9.0 JDBC4 (build 801)
major : 9
minor : 0
11:16:07.675 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - JDBC version : 4.0
11:16:07.689 [AWT-EventQueue-0] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
11:16:07.709 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder - JDBC driver metadata reported database stores quoted identifiers in neither upper, lower nor mixed case
11:16:07.716 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.DefaultSchemaNameResolver - Unable to use Java 1.7 Connection#getSchema
11:16:07.718 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl - Unable to resolve connection default schema
org.hibernate.HibernateException: Use of DefaultSchemaNameResolver requires Dialect to provide the proper SQL statement/command but provided Dialect [org.hibernate.dialect.PostgreSQLDialect] did not return anything from Dialect#getCurrentSchemaCommand
我必须更新驱动程序才能显示
11:45:27.477 [AWT-EventQueue-0] DEBUG org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator - Driver ->
name : PostgreSQL JDBC Driver
version : 42.2.23
major : 42
minor : 2
我不得不把我的方言改成
PostgreSQL10方言
关于spring - hibernate 异常 : Use of DefaultSchemaNameResolver requires Dialect to provide the proper SQL statement/command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55723554/
我是Gradle的Spring Application的新手。 运行我的项目以基于创建的类创建数据库对象,出现以下错误: Exception in thread "main" org.springfr
在 hibernate.xml 中,我有: org.hibernate.dialect.PostgreSQLDialect 这就是我正在尝试做的事情: final Session sess = ses
运行应用程序时出现以下错误。 我的数据配置文件 package com.book.data; import java.util.Properties; import javax.persistence
我是这样配置的,为什么会报上面的错误? spring.jpa.show-sql = true logging.level.org.springframework.data=DEBUG spring.j
spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.postgis.PostgisDialect 我有一个带有
使用hibernate-entitymanager 4.2.8.Final hibernate 空间 4.0 Session session = sessionProvider.get(); Crit
我是 hibernate 的新手,所以我通过观看视频教程进行练习。我关注的链接是, https://www.youtube.com/watch?v=FFMOZY4z6bE&list=PL4AFF701
我使用 Spring Boot 1.4.1.RELEASE、Hibernate、PostgreSQL 9.6.0.x。我看到 IntelliJ IDEA 建议使用 2 种方言: # Hibernate
我有 Eclipse RCP 应用程序。具有 hibernate 功能的 JAR 位于另一个插件中,该插件包含在 MANIFEST.MF 的主项目中。 我尝试建立简单的连接 Hibernate ->
com.org.springsApps.Student org.hibernate.dialect.orac
Dialect 是一个简单明了的应用,可以让你使用 Web 服务进行语言间的翻译。想要了解更多的话,让我们来一窥究竟。 虽然你可以启动 Web 浏览器并直接使用任何翻译服务来完成工作,但桌面应
我正在尝试为以下内容运行 hello world:带有 HSQLDB 和 C3PO 连接池的 Spring/Hibernate。 相同的代码适用于 mySQL(仅适用于不同的方言和驱动程序) 我已经运
这是我的 Person.java 类 package com.hibernate.project.pos.model; import javax.persistence.*; @Entity @T
我正在尝试使用 MySQL 5.7 数据库中的 REGEXP 函数在 H2 内存数据库上运行 JPQL。我想使用相同的查询进行集成测试。 由于 H2 上不存在 REGEXP 函数,我正在尝试注册一个新
我的项目中有 persistence.xml 文件,在这个文件中设置了一个属性,所以我很好奇,为什么要设置它?它有什么作用? 最佳答案 虽然基本 SQL 是一个标准,但不同的数据库对标准之外的某些事
我在使用 Hibernate 时遇到以下错误: 'hibernate.dialect' 必须在没有可用连接时设置 我正在使用数据源进行数据库连接。 最佳答案 问题可能是您没有为您尝试连接的数据库安装客
我尝试在 hibernate 中执行简单的 sql 事务时遇到错误。我正在使用 hibernate 4.3,它说 derby dialect has been deprecated 我试着用谷歌搜索,
遇到的问题 在运行时,我总是得到以下 NHibernate.MappingException : "Could not compile the mapping document: GI.Invento
我的 YML 中有此 JPA 配置。 jpa: database-platform: DB2Platform ddl-auto: create-drop hi
在使用 spring3 设置 hibernate 时遇到更多问题。这次是说连接是空的,因为我的 hibernate.cfg.xml 文件中没有设置方言。 这里是完整的异常(exception):
我是一名优秀的程序员,十分优秀!