Oracle到MySQL数据库迁移之--主键生成策略替换
Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的 替换的时候,主要有三个地方需要修改:
注解方式完成hibernate映射的实体的修改使用Oracle Sequence假如你之前的程序使用的是 // 注意: 如果不指定sequenceName的话,默认为HIBERNATE_SEQUENCE,这个序列也需要在Oracle中手动建立.
@SequenceGenerator(name = "generator",sequenceName = "SEQ")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "generator")
public Long getId() {
return id;
}
使用MySQL表模拟Oracle Sequence首先你需要在MySQL中建立一个表 > select * from sys_sequence;
+--------------+------------+
| seq_name | curr_value |
+--------------+------------+
| SEQ | 2809 |
+--------------+------------+
. 然后在程序中如下编写: /** * allocationSize是每次程序启动第一次插入时与之前最大值的差值. */
@Id
@TableGenerator(name = "sequence",table = "sys_sequence",pkColumnName = "seq_name",valueColumnName = "curr_value",pkColumnValue = "SEQ",allocationSize = 1)
@GeneratedValue(strategy = GenerationType.TABLE,generator = "sequence")
private Long id;
xml方式完成hibernate映射的实体的修改使用Oracle Sequence之前使用 <id name="id">
<generator class="sequence">
<param name="sequence">SEQ</param>
</generator>
</id>
使用MySQL表模拟Oracle Sequence表的结构与前面注解方式所用的表结构相同. 这次我们在xml中使用的generator是 <id name="id">
<generator class="org.hibernate.id.enhanced.TableGenerator">
<param name="table_name">sys_sequence</param>
<param name="segment_column_name">seq_name</param>
<param name="value_column_name">curr_value</param>
<param name="segment_value">SEQ</param>
<param name="increment_size">1</param>
</generator>
</id>
存储过程的修改存储过程中,主要涉及到 使用Oracle Sequence假设我们现在有一个 SEQ.nextval 使用MySQL模拟Oracle Sequence首先需要创建一个表格,用于存储所有序列的名称,当前值以及递增步长. 这里我们继续沿用前面所述的 > select * from sys_sequence;
+--------------+------------+--------------+
| seq_name | curr_value | increment_by |
+--------------+------------+--------------+
| SEQ | 2809 | 1 |
+--------------+------------+--------------+
然后在数据库中新增两个函数,一个是 CREATE DEFINER=`root`@`%` FUNCTION `currval`(`v_seq_name` varchar(50)) RETURNS decimal(18,0) BEGIN DECLARE v_currval DECIMAL(18);
SET v_currval = 1;
SELECT curr_value INTO v_currval FROM sys_sequence WHERE seq_name = v_seq_name;
RETURN v_currval;
END
另一个是 CREATE DEFINER=`root`@`%` FUNCTION `nextval`(`v_seq_name` varchar(50)) RETURNS decimal(18,0) BEGIN UPDATE sys_sequence SET curr_value = curr_value + increment_by WHERE seq_name = v_seq_name;
RETURN currval(v_seq_name);
END
之后在需要使用 nextval('SEQ') 小结如此一来,就达到了利用MySQL的表来模拟Oracle的Sequence的目的. 以后每当有需要替换的序列,都在前面建立的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |