JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
这里如果是mysql数据库一般使用Identity,Oracle 使用Sequence。 当使用Auto时,如果使用Oracle且配置了Sequence则使用Sequence,Mysql则使用Identity 。主键生成策略应该配置为Auto 并配置Squeuence,Oracle转mysql 则不会有问题。
2.DDL的问题
Orcale 里可以写 create or replace table Table_name
Mysql 需要变换为 Drop Table Table_name if exists table_name
create table table_name
3.Mysql需要对自增主键添加 auto_increment
Oracle中一般会先建立表然后通过 alter table 设置表的 主键,这时需要注意,我们需要将主键定义在create table语句中进行。
4.Mysql引擎的选择
Mysql5.*默认为Innodb,支持事物以及行锁表锁,所以应选择Innodb ,但是对于使用空间数据的情况需要使用MyISAM,因为Innodb不支持空间数据
5.数据类型的转换
下表是数据类型映射的表
MySQL Data Type | Oracle Data Type |
BIGINT | NUMBER(19, 0) |
BIT | RAW |
BLOB | BLOB, RAW |
CHAR | CHAR |
DATE | DATE |
DATETIME | DATE |
DECIMAL | FLOAT (24) |
DOUBLE | FLOAT (24) |
DOUBLE PRECISION | FLOAT (24) |
ENUM | VARCHAR2 |
FLOAT | FLOAT |
INT | NUMBER(10, 0) |
INTEGER | NUMBER(10, 0) |
LONGBLOB | BLOB, RAW |
LONGTEXT | CLOB, RAW |
MEDIUMBLOB | BLOB, RAW |
MEDIUMINT | NUMBER(7, 0) |
MEDIUMTEXT | CLOB, RAW |
NUMERIC | NUMBER |
REAL | FLOAT (24) |
SET | VARCHAR2 |
SMALLINT | NUMBER(5, 0) |
TEXT | VARCHAR2, CLOB |
TIME | DATE |
TIMESTAMP | DATE |
TINYBLOB | RAW |
TINYINT | NUMBER(3, 0) |
TINYTEXT | VARCHAR2 |
VARCHAR | VARCHAR2, CLOB |
YEAR | NUMBER |
主要关注date,number,varchar2 的转换。其中需要注意 varchar2 的转换,因为在oracle 中varchar2表示存储的字节数,与编码有关,而mysql中varchar则没有,mysql中varchar(30)表示存储30个字符,所以此处需要注意。至于date 因为不需要支持微妙,所以我使用timestamp储存了。
6.常用的系统函数变化
to_date --> char_to_date to_char-->date_to_char ||-->concat
7. hql 中需要注意,避免使用原始sql尽量使用hql,尤其是日期处理。对于空串的处理,在oracle中 varchar2下传入空串则oracle作为 null处理,所以你搜索空串是无结果的
但是mysql中是有空串的. mysql中需要为子查询设置别名要么也会报错。分页查询,mysql中没有rownum,可以使用limit实现,建议使用hql。
8.注意切换hibernate方言
9.触发器与存储过程
oracle的触发器比较高端,对于行触发器支持到按照某列改变触发,而mysql只支持行触发。 oracle中可以判断当前操作类型update,delete 还是 insert,mysql只能分开写 了。变量声明的语法也不相同,需要注意(会详细写一篇)
10。获取当前使用的数据库
我的方法比较屌丝根据Hibernate方言判断使用哪种
11.一些语法上的限制