oracle开发使用sequence但是在mysql中没有sequence的解决方案
在开发工程中遇到问题,以前开发使用oracle数据库最近使用mysql数据库一些不兼容的问题,例如oracle中的sequence的问题,下面是我的解决方法,经过测试的。
下面的解决思路是参考网上的,自己进行了修改并且验证了。
1.首先原理,oracle的sequence是oracle数据库自带的,也就是在oracle数据库中已经存在实现sequence的表和方法.但是在mysql中没有sequence,那么我们可以模拟oracle的操作原理,在mysql中实现那么mysql也就支持sequence了,原理是在mysql中创建一张表来存储你所创建的squence,创建function来操作这张表。
思路:我们可以用一张表来记录sequence数据,其实在使用oracle sequence的时候也类似是一张表,currentval、nextval和增长系数就类似表中的字段。而currentval、nextval我们可以设计成两个function这样在调用的时候返回currentval、nextval的值。
A:创建一张表hibernate_sequence保存你的sequence
CREATE TABLE `hibernate_sequence` (
`seqname` varchar(50) NOT NULL,
`currentValue` int(11) NOT NULL,
`increment` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`seqname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这张表中存放sequence每一条数据是一个sequence.
B:
添加一条数据(也就是添加一个sequence)
insert into `hibernate_sequence`(`seqname`,`currentValue`,`increment`) values ('account_sequence',100,1);
这个sequence的名字是account_sequence,起始是100,每次加一
C:
创建获取当前值的function
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BRGIN
DECLARE current INTEGER;
SET current=0;
select currentValue into current from hibernate_sequence where seqname=seq_name;
return current;
END$
DELIMITER ;
创建获取下一个值
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BRGIN
UPDATE seqMysql
SET currentValue = currentValue + increment
WHERE seqname = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ; 设置增长系数function:DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
RETURNS INTEGER
CONTAINS SQL
BEGIN
UPDATE seqMysql
SET currentValue = value
WHERE seqname = seq_name;
RETURN currval(seq_name);
END$
DELIMITER ;
到现在的已经把account_sequence已经创建好了从100开始每次自增1,现在可以在代码里面配置hibernate
配置hibernate
如果是使用oracle的就是普通配置,使用oracle的sequence,就不用上面的配置了。
S_FRAMEWORK是sequence的名字
<id name="id" type="java.lang.Long">
<generator class="native">
<param name="sequence">S_FRAMEWORK</param>
</generator>
</id>
如果是mysql的配置需要上面的ABC步骤
<id name="id" type="java.lang.Long">
<column name="company_id" />
<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
<!--使用hibernate_sequence表中的sequence-->
<param name="force_table_use">hibernate_sequence</param>
<!--使用hibernate_sequence表中的currentValue字段为自增的主键-->
<param name="value_column">currentValue</param>
<!--sequence的名字,是"account_sequence"这个名字就是上面你insert的sequence的名字-->
<param name="sequence_name">account_sequence</param>
<!-- 获取下一个sequence值调用数据库的方法 -->
<param name="next_val">nextval</param>
</generator>
</id>
到此mysql中实现oracle的squeeze的功能到此配置完成那几个表使用就把这一段代码复制到对应的映射文件中。