都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的容易,是相对的。 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。 下面记录一下我做这件事情
都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的。
想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用了Hibernate框架就能实现的。
下面记录一下我做这件事情的过程和一些感悟。
当我接到该任务时,我先大致的理了一下思路:
要完成迁移,总体上有2大块工作要做,分别是:数据库层面的迁移 和 平台底层代码的改造
一、数据库层面的迁移过程:
1、通过sqlServer Studio2008 工具将数据从Oracle导入到SqlServer数据库
从SSMS2008开始才支持此功能,具体操作步骤(右键点击数据库-选择导入-点下一步-选择 Oracle Provider for OLE DB 数据源-点击属性-填写数据源,格式为 IP:端口/实例名),后面的步骤根据向导一步步的操作即可。需要注意的是在 选择源表和源视图的步骤中:
(1)、要把【目标】列中的默认前缀去掉,这样导入的表才会默认关联到dbo下,否则你每次查询表都要带上schema前缀,导致你之前的应用程序中的sql无法执行,因为你之前写的那些sql肯定不会带这种前缀。
(2)、先勾选你要导入的源,然后双击每一行记录,在弹出的对话框中检查是否所有的类型都正确绑定好了,我在检查的时候就遇到了oracle中是varchar2类型的,在该对话框显示的表结构中变成了130,只能手动的去将所有130改成varchar类型(sqlserver里没有varchar2类型)。还有原来是clob类型的,现在变成了varchar,要手动改成text类型(因为clob类型的字段比较少,所以可以通过在oracle中执行“select * from user_tab_columns c where c.data_type='CLOB';”来查看哪些表中用到了CLOB类型的字段)。
2、增加to_date、to_char、to_number、concat等常用的函数
说明:我在编写to_date函数的时候,只提供了一种格式“yyyy-mm-dd HH:mi:ss”,这是因为在sqlserver中是没有和to_date函数的类似的函数的,只能使用convert函数实现,但是convert函数不支持传入格式化字符串,只能传入格式字符对应的整型数字,而120对应的正是之前提到的“yyyy-mm-dd HH:mi:ss”格式;另外此次是迁移到Sqlserver2005,该版本是没有内嵌concat函数的,根据官方文档的说法,是从sqlServer2012开始才有concat函数的,所以这里我要自己编写一个concat函数。
<span>--</span><span>----------------------------------------------------------------concat函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[concat] Script Date: 03/10/2015 17:11:31 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>concat</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span>(<span>500</span><span>), </span><span>@param2</span> <span>varchar</span>(<span>500</span><span>) ) </span><span>returns</span> <span>varchar</span>(<span>1000</span><span>) </span><span>as</span> <span>begin</span> <span>DECLARE</span> <span>@returntext</span> <span>varchar</span>(<span>1000</span><span>) </span><span>if</span> (<span>@param1</span> <span>is</span> <span>null</span><span>) </span><span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param2</span><span>; </span><span>else</span> <span>if</span> (<span>@param2</span> <span>is</span> <span>null</span><span>) </span><span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param1</span><span>; </span><span>else</span> <span>SELECT</span> <span>@returntext</span><span>=</span> <span>@param1</span> <span>+</span> <span>@param2</span><span>; </span><span>return</span> <span>@returntext</span><span>; </span><span>end</span> <span>--</span><span>------------------------------------------------------------------to_char函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_char] Script Date: 03/10/2015 17:12:09 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_char</span><span>]</span><span> ( </span><span>@param1</span> <span>datetime</span><span>, </span><span>@param2</span> <span>varchar</span>(<span>20</span><span>) ) </span><span>returns</span> <span>varchar</span>(<span>20</span><span>) </span><span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(<span>varchar</span>(<span>20</span>),<span>@param1</span>,<span>120</span><span>) </span><span>end</span> <span>--</span><span>------------------------------------------------------------------to_date函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_date] Script Date: 03/10/2015 17:12:58 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_date</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span>(<span>20</span><span>), </span><span>@param2</span> <span>varchar</span>(<span>20</span><span>) ) </span><span>returns</span> <span>datetime</span> <span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(<span>datetime</span>,<span>@param1</span>,<span>120</span>)<span>--</span><span>120 means that yyyy-mm-dd hh:mi:ss(24h)</span> <span>end</span> <span>--</span><span>------------------------------------------------------------------to_number函数</span> <span>USE</span> <span>[</span><span>skyplatform</span><span>]</span> <span>GO</span> <span>/*</span><span>***** Object: UserDefinedFunction [dbo].[to_number] Script Date: 03/10/2015 17:13:09 *****</span><span>*/</span> <span>SET</span> ANSI_NULLS <span>ON</span> <span>GO</span> <span>SET</span> QUOTED_IDENTIFIER <span>ON</span> <span>GO</span> <span>CREATE</span> <span>FUNCTION</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>to_number</span><span>]</span><span> ( </span><span>@param1</span> <span>varchar</span><span> ) </span><span>returns</span><span> numeric </span><span>as</span> <span>begin</span> <span>return</span> <span>convert</span>(numeric,<span>@param1</span><span>) </span><span>end</span>
二、平台底层代码的改造
1、引入SqlServer的jar包:sqljdbc4-4.0.jar
<span><span>groupId</span><span>></span>com.microsoft.sqlserver<span></span><span>groupId</span><span>></span> <span><span>artifactId</span><span>></span>sqljdbc4<span></span><span>artifactId</span><span>></span> <span><span>version</span><span>></span>4.0<span></span><span>version</span><span>></span></span></span></span>
2、修改db.properties中关于数据库连接信息的配置
<span>jdbc.dialect=org.hibernate.dialect.SQLServerDialect jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.url=jdbc:sqlserver://xx.xx.xx.xx:1433;DatabaseName=xxx jdbc.default_schema=dbo jdbc.username=xxx jdbc.password=xxx</span>
3、修改平台中使用的一些非sql标准的语法
在使用delete insert update这些dml语句的时候,切记不要使用别名,因为在oracle和sqlserver中,这些dml语句使用别名的语法是不一样的。
4、各实体类主键策略的改造
最好都使用string类型的主键,但是因为之前的代码中都用的sequence做主键策略,现在改成string类型工作量势必很大,所以决定使用table策略来兼容各种数据库。
5、dao层对sql的处理
由于sqlserver中调用自定义标量值函数,必须在函数名前加上dbo.的前缀,但是这样写势必会导致不能兼容其它的关系型数据库,所以只能从dao实现层,对sql进行统一的处理,处理规则就是:如果当前数据库是sqlserver,并且sql中出现了concat、to_date、to_char、to_number等函数,就为这些函数名加上dbo.的前缀。
以上做完,基本就可以让平台在sqlserver数据库上跑了,同时也可以通过改配置文件切换到Oracle数据库。
以上的做法可能并不是最优的方式,如果有更好的方案,希望各位大牛能给予指点。

译者 | 布加迪审校 | 孙淑娟目前,没有用于构建和管理机器学习(ML)应用程序的标准实践。机器学习项目组织得不好,缺乏可重复性,而且从长远来看容易彻底失败。因此,我们需要一套流程来帮助自己在整个机器学习生命周期中保持质量、可持续性、稳健性和成本管理。图1. 机器学习开发生命周期流程使用质量保证方法开发机器学习应用程序的跨行业标准流程(CRISP-ML(Q))是CRISP-DM的升级版,以确保机器学习产品的质量。CRISP-ML(Q)有六个单独的阶段:1. 业务和数据理解2. 数据准备3. 模型

thinkphp是国产框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。

什么是 celery这次我们来介绍一下 Python 的一个第三方模块 celery,那么 celery 是什么呢? celery 是一个灵活且可靠的,处理大量消息的分布式系统,可以在多个节点之间处理某个任务; celery 是一个专注于实时处理的任务队列,支持任务调度; celery 是开源的,有很多的使用者; celery 完全基于 Python 语言编写;所以 celery 本质上就是一个任务调度框架,类似于 Apache 的 airflow,当然 airflow 也是基于 Python

AI就像一个黑匣子,能自己做出决定,但是人们并不清楚其中缘由。建立一个AI模型,输入数据,然后再输出结果,但有一个问题就是我们不能解释AI为何会得出这样的结论。需要了解AI如何得出某个结论背后的原因,而不是仅仅接受一个在没有上下文或解释的情况下输出的结果。可解释性旨在帮助人们理解:如何学习的?学到了什么?针对一个特定输入为什么会做出如此决策?决策是否可靠?在本文中,我将介绍6个用于可解释性的Python框架。SHAPSHapleyAdditiveexplanation(SHapleyAdditi

已安装Microsoft.NET版本4.5.2、4.6或4.6.1的MicrosoftWindows用户如果希望Microsoft将来通过产品更新支持该框架,则必须安装较新版本的Microsoft框架。据微软称,这三个框架都将在2022年4月26日停止支持。支持日期结束后,产品将不会收到“安全修复或技术支持”。大多数家庭设备通过Windows更新保持最新。这些设备已经安装了较新版本的框架,例如.NETFramework4.8。未自动更新的设备可能

在SpringBoot项目中集成Hibernate前言Hibernate是一个流行的ORM(对象关系映射)框架,它可以将Java对象映射到数据库表,从而方便地进行持久化操作。在SpringBoot项目中,集成Hibernate可以帮助我们更轻松地进行数据库操作,本文将介绍如何在SpringBoot项目中集成Hibernate,并提供相应的示例。1.引入依赖在pom.xml文件中引入以下依赖:org.springframework.bootspring-boot-starter-data-jpam

如果你在Windows11上安装了2022年5月累积更新,你可能已经注意到你一直使用的许多应用程序都不像以前那样工作了。强制性安全更新KB5013943正在使某些使用.NET框架的应用程序崩溃。在某些情况下,用户会收到错误代码:0xc0000135。可选更新中报告了类似的问题,但并不普遍。随着2022年5月的更新,该错误似乎已进入生产渠道,这次有更多用户受到影响。崩溃在使用.NETFramework的应用程序中很常见,Discord或MicrosoftTeams等

Java是一种面向对象编程语言,它被广泛地应用于软件开发领域。Hibernate是一种流行的Java持久化框架,它提供了一种简单且高效的方式来管理Java对象的持久化。然而,开发过程中经常会遇到Hibernate错误,这些错误可能会导致程序的异常终止或者不稳定。如何处理和避免Hibernate错误成为了Java开发者必须掌握的能力。本文将介绍一些常见的Hib


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用