一、原有架构采用mysql,由于信创环境,需要更换国产的数据库
步骤如下
1、确定JDK版本选择对应的达梦数据库版
/***************************************
* 达梦8 JDBC驱动版本说明
/***************************************
1. DmJdbcDriver16 对应 Jdk1.6 及以上环境
2. DmJdbcDriver17 对应 Jdk1.7 及以上环境
3. DmJdbcDriver18 对应 Jdk1.8 及以上环境
/***************************************
* 达梦8 hibernate方言包对应版本说明
/***************************************
jar包在dialect目录下:
1. DmDialect-for-hibernate2.0.jar 对应 Jdk1.4及以上, hibernate2.0 环境
2. DmDialect-for-hibernate2.1.jar 对应 Jdk1.4及以上, hibernate2.1 -- 2.X 环境
3. DmDialect-for-hibernate3.0.jar 对应 Jdk1.4及以上, hibernate3.0 环境
4. DmDialect-for-hibernate3.1.jar 对应 Jdk1.4及以上, hibernate3.1 -- 3.5 环境
5. DmDialect-for-hibernate3.6.jar 对应 Jdk1.5及以上, hibernate3.6 -- 3.X 环境
6. DmDialect-for-hibernate4.0.jar 对应 Jdk1.6及以上, hibernate4.0 -- 4.X 环境
7. DmDialect-for-hibernate5.0.jar 对应 Jdk1.7及以上, hibernate5.0 -- 5.2 环境
8. DmDialect-for-hibernate5.3.jar 对应 Jdk1.7及以上, hibernate5.3 -- 5.4 环境
注1:以上的hibernate版本指的是hibernate ORM版本,注意区分hibernate search版本
/***************************************
* Hibernate.cfg.xml配置说明
/***************************************
1、驱动名称
dm.jdbc.driver.DmDriver
2、方言包名称
org.hibernate.dialect.DmDialect
/***************************************
* 其他jar包说明
/***************************************
1. DmDictionary.jar openjpa1.2方言包,对应 Jdk1.6及以上环境
2. dmjooq-dialect-3.12.3.jar jooq方言包,对应 Jdk1.8及以上环境
3. dm8-oracle-jdbc16-wrapper.jar oracle 到达梦的JDBC驱动桥接,应用中如果使用了非标准的oracle JDBC特有的对象,无需修改应用代码,可以桥接到达梦的JDBC连接达梦数据库,对应 Jdk1.6及以上环境
4. DmHibernateSpatial-1.0.jar hibernate spatial方言包,对应hibernate spatial 1.0环境,对应 Jdk1.5及以上环境
5. DmHibernateSpatial-1.1.jar hibernate spatial方言包,对应hibernate spatial 1.1环境,对应 Jdk1.5及以上环境
6. gt-dameng-2.8.jar GeoServer 2.8环境方言包,对应 Jdk1.6及以上环境
7. gt-dameng-2.11.jar GeoServer 2.11环境方言包,对应 Jdk1.8及以上环境
8. gt-dameng-2.15.jar GeoServer 2.15环境方言包,对应 Jdk1.8及以上环境
/***************************************
* maven仓库下载
/***************************************
group id: com.dameng
各版本jar查找网址: https://search.maven.org/search?q=com.dameng
maven依赖配置示例:
com.dameng
DmJdbcDriver18
8.1.1.193
2、修改yml配置文件,主要更改驱动和连接
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:5236/ROOT?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
username: ROOT
password: xxxx
3、启动程序,这个时候会报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1108)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:868)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at top.cfl.cflwork.GeneralarchivesApplication.main(GeneralarchivesApplication.java:25)
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:275)
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.(InFlightMetadataCollectorImpl.java:176)
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:118)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1202)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1233)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792)
... 14 common frames omitted
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:100)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54)
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137)
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)
... 31 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:61683', transport: 'socket'
4、查问题,是因为没有配置断言
spring:
datasource:
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:5236/ROOT?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
username: ROOT
password: cfl,19971997
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.DmDialect
show-sql: true
5、重启,成功
6、达梦数据库语法总结
以下介绍来自于达梦数据库官网,相关的文档在官网中也是可以下载的。
达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM,它具有如下特点:
1、通用性
达梦数据库管理系统兼容多种硬件体系,可运行于X86、X64、SPARC、POWER等硬件体系之上。DM各种平台上的数据存储结构和消息通信结构完全一致,使得DM各种组件在不同的硬件平台上具有一致的使用特性。
达梦数据库管理系统产品实现了平台无关性,支持Windows系列、各版本Linux(2.4及2.4以上内核)、Unix、Kylin、AIX、Solaris等各种主流操作系统。达梦数据库的服务器、接口程序和管理工具均可在32位/64 位版本操作系统上使用。
2、高性能
支持列存储、数据压缩、物化视图等面向联机事务分析场景的优化选项;
通过表级行存储、列存储选项技术,在同一产品中提供对联机事务处理和联机分析处理业务场景的支持;
3、高可用
可配置数据守护系统(主备),自动快速故障恢复,具有强大的容灾处理能力。
4、跨平台
跨平台,支持主流软硬件体系(支持windows、Linux、中标麒麟、银河麒麟等操作系统),支持主流标准接口。
5、高可扩展
支持拓展软件包和多种工具,实现海量数据分析处理、数据共享集群(DSC)和无共享数据库集群(MPP)等扩展功能
与MySQL的区别
1. 创建表的时候,不支持在列的后面直接加 comment 注释,使用 COMMENT ON IS 代替,如:
COMMENT ON TABLE xxx IS xxx
COMMENT ON COLUMN xxx IS xxx
2. 不支持 date_sub 函数,使用 dateadd(datepart,n,date) 代替,
其中,datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n), second(ss,s), millisecond(ms)
例子:
select dateadd(month, -6, now());
select dateadd(month, 2, now());
3. 不支持 date_format 函数,它有三种代替方法:
a: 使用 datepart 代替:语法:datepart(datepart, date),返回代表日期的指定部分的整数,
datepart可以为:year(yy,yyyy),quarter(qq,q),month(mm,m),dayofyear(dy,y),day(dd,d),week(wk,ww),weekday(dw),hour(hh), minute(mi,n),second(ss,s), millisecond(ms)
例子:
select datepart(year, '2018-12-13 08:45:00'); --2018
select datepart(month, '2018-12-13 08:45:00'); --12
b: 使用 date_part 代替,功能和 datepart 一样,写法不同,参数顺序颠倒,且都要加引号,
例子:
select date_part('2018-12-13 08:45:00', 'year');--2018
select date_part('2018-12-13 08:45:00', 'mm'); -- 12
c: 使用 extract 代替,语法:extract(dtfield from date),从日期类型date中抽取dtfield对应的值
dtfield 可以是 year,month,day,hour,minute,second
例子:
select extract(year from '2018-12-13 08:45:00'); --2018
select extract(month from '2018-12-13 08:45:00'); --12
4. 不支持 substring_index 函数, 使用 substr / substring 代替,
语法:
substr(char[,m[,n]])
substring(char[from m[ for n]])
5. 不支持 group_concat 函数,使用 wm_concat 代替,
例子:
select wm_concat(id) as idstr from persion ORDER BY id ;
6. 不支持 from_unixtime 函数,使用 round 代替
语法:round(date[,format])
7. 不支持 case-when-then-else ,
例如:
select case when id = 2 then "aaa" when id = 3 then "bbb" else "ccc" end as test
from (select id from person) tt;
8. current_timestamp 的返回值带有时区,
例子:
select current_timestamp();
2018-12-17 14:34:18.433839 +08:00
9. convert(type, value) 函数,
与 mysql 的 convert 一样,但是参数是反过来的,mysql 是 convert(value, type)
10. 不支持 on duplicate key update,
使用 merge into 代替
11. 不支持 ignore,即 insert ignore into
12. 不支持 replace into,
使用 merge into 代替
13. 不支持 if。
14. 不支持 "",只支持''
15. 不支持 auto_increment, 使用 identity 代替
如: identity(1, 1),从 1 开始,每次增 1
16. 不支持 longtext 类型,
可用 CLOB 代替。
总结
达梦数据库和 oracle 数据库比较像,如果找不到和 MySQL 对应的函数,可以看下 oracle 的相关函数。