Spring Boot多数据源问题
1.com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 ‘pg_class’ 无效。
解决方法很奇怪,只要注释掉ddl-auto: update就可以了。
1 | # jpa: |
或者改为:
1 | spring: |
2.对象名 ‘sec_his’ 无效
(1) 这个sec_his我在代码里没有,但是我有一个类名为SecHis,即实体为SecHis。初步查询资料,以为是返回值的问题,进行了尝试,没有任何的效果。
1.Jpa多数据源,为每个数据源配置单独的命名策略
2.HikariPool-1 - Driver does not support get/set network timeout for connections
3.com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 ‘xxx’ 无效
4.spring boot 2 多数据源详细配置
5.spring - 配置多个数据源后无法设置JPA命名策略(Spring 1.4.1 / Hibernate 5.x)
6.sql中could not extract ResultSet 问题~
7.could not extract ResultSet错误
(2) 命名规则的问题
通过打开hibernate自动生成的sql语句,我发现了在查询表的时候,表名是用下滑线自动生成的,但是我的数据库的表名是secHis,而不是sec_his
经过我新建一个表,然后表名和字段名都统一使用小写,然后进行查询,结果出现的查询是正确的,那么最终确定了原因,就是hibernate的命名策略的问题。
我在getVendorProperties中,分别使用了下面的属性,但是还是不起作用,比如:physical_naming_strategy,DefaultNamingStrategy等。
1 | private Map<String, Object> getVendorProperties(DataSource dataSource) { |
命名策略主要有:
(1) org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
默认策略的表现为:表名及字段全小写,并以下划线分隔
(2) org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
Hibernate 提供的命名策略是以实体名和属性名分别作为表名及字段名,但如果有定义 @Table 和 @Column ,则以该属性值进行映射命名
经过长时间的探索,终于找到了合适的命名策略的配置,implicit-strategy和physical-strategy缺一不可,这样就可以实现上面的第二条命名策略的效果了:以实体名和属性名分别作为表名及字段名,但如果有定义 @Table 和 @Column ,则以该属性值进行映射命名
1 | spring: |
1.springBoot整合hibernate表名总是小写
2.Spring boot 自定义数据库命名策略 (这篇文章也写了如何自定义命名策略)
3.jpa多数据源时Hibernate配置自动生成表不生效 (这个其实可以看到如何配置hibernate,从源码的角度分析为什么配置不生效,但是说的不够全面,我也没有成功)
4.Spring Boot下使用JPA报错:’hibernate.dialect’ not set的解决办法
5.【hibernate】hibernate不同版本的命名策略
6.Hibernate5中实体映射命名策略
7.Hibernate入门之命名策略(naming strategy)详解 (这里写了四种命名策略,但是好像都说不到点子上,作为源码参考或者是理清命名策略的方法倒是可以参考)
8.Hibernate中实体映射时的命名策略(1)
9.如何自定义 JPA 的数据库命名策略 (这个讲的很清楚,只有两种命名策略,以及如何实现自定义的命名策略)
10.Jpa多数据源,为每个数据源配置单独的命名策略 (这里写了如何为多源数据库分别设置命名策略,但是很遗憾,我的springboot版本2.3.1中没有jpaProperties.getHibernate()方法,参见参考文章11、12、13)
11.12.1.从零开始学springboot-getHibernateProperties报错问题
12.Undefined method error occurs after upgrading from spring boot 2.0.6 to 2.1.0
13.getHibernateProperties cannot resolve,Spring boot 2.1.0+ JPA多数据源配置
14.Hibernate5中实体映射命名策略 (这篇文章,Hibernate5将此视为2阶段过程,最终让我测试成功了,实现了自己的功能)
15.SpringBoot和JPA多数据源整合 (这篇文章对多源数据分别进行不同的hibernate进行配置,提供了思路,比如不同的数据源配置不同的方言dialect)
3.Could not fetch the SequenceInformation from the database
(1) 当我在hibrenate属性中配置ddl-auto:update时,总会弹出这个错误:com.microsoft.sqlserver.jdbc.SQLServerException: 对象名 ‘INFORMATION_SCHEMA.SEQUENCES’ 无效,将属性删掉之后,就好了。
还有就是除了ddl-auto,我看有些文章中还设置了hibernate.hbm2ddl.auto这个属性,我却没有找到两者有什么差距的文章,但是两者使用方式和结果都是一样的。
最后经过周转,发现是因为我在第二个数据源的属性配置中添加了properties.remove(“hibernate.temp.use_jdbc_metadata_defaults”);这句代码,将其删除就不会报错了。
1 | private Map<String, Object> getVendorProperties(DataSource dataSource) { |
但是我也不能加上ddl-auto:update,否则也会报同样的错误。
根据进一步的分析无法添加ddl-auto:update,多半是因为没有数据的写权限,因为我连接数据的时候,使用了只读的账号,所以无法自动创建数据表。
(2) 在第二个数据源也就是sqlserver数据源的属性中必须添加如下代码,否则也会出现:对象名 ‘INFORMATION_SCHEMA.SEQUENCES’ 无效
1 | private Map<String, Object> getVendorProperties(DataSource dataSource) { |
问题虽然被解决了,但是我还是有一个非常疑惑的问题,就是“createClob() 方法尚未被实作问题”不见了,当我删除掉所有的配置代码,回归到最初的状态,甚至没有添加hibernate.temp.use_jdbc_metadata_defaults属性时,程序竟然没有报错,我也已经无法还原事故现场了,无论怎么改,都还原不到出现“未被实作”的状态了。
终于知道如何才能出现“createClob() 方法尚未被实作问题”问题了
是因为使用的版本问题,使用2.1.8.RELEASE版本就会出现“createClob() 方法尚未被实作问题”,当把版本升级到2.3.1.RELEASE,这个postgresql问题就应没有了。
1 | <parent> |
总结
针对多数据源的时候,第一数据源为postgresql,第二个数据源为sql server,则需要有以下几点配置
~~ (1) sql server数据源,必须添加:hibernate.temp.use_jdbc_metadata_defaults=false
(2) sql server数据源连接时如何是只读用户,不能设置:hibernate.hbm2ddl.auto=update
(3) 当第二个数据源sqlserver设置了hibernate.temp.use_jdbc_metadata_defaults=false,即便第一个数据源postgresql数据源不设置:hibernate.temp.use_jdbc_metadata_defaults=false也不会再报错createClob() 方法尚未被实作问题 ~~
(1) 如果sql server数据源配置了:”hibernate.dialect”=”org.hibernate.dialect.SQLServer2012Dialect”,就要相应的配置:”hibernate.temp.use_jdbc_metadata_defaults”=”false”,否则会报对象名 ‘INFORMATION_SCHEMA.SEQUENCES’ 无效
(2) ql server数据源连接时如何是只读用户,不能设置:hibernate.hbm2ddl.auto=update
1.spring-data-jpa ddl-auto权限
2.解决方案:Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
3.jpa的hibernate.ddl-auto的几个属性值区别
4.hibernate.hbm2ddl.auto配置详解
5.hibernate.hbm2ddl.auto含义介绍
6.Hibernate的hbm2ddl.auto=update的内幕
7.Spring Boot Oracle SqlServer 多数据源连接配置 (这里介绍了多种jpa方言)