由于经验的不足,在设计数据库时,将表UP_CATEGORY_CATEGORY的主键交由Spring维护,之前设计可以实现方法如下。
Oracle数据库
先在数据库建立一个自增序列。
Mysql数据库
需要再建一个表,新建一列,作为主键值的容器,同时在Spring的配置文件中加入Mysql的自增键管理bean- org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer,同时设置数据库自增键表的表名,列名,获得主键的方法和Oracle一样。
以上设计存在如下问题。
对数据库特性依赖比较高。
不同数据库的配置也不同,不能一劳永逸。
在测试时发现在oracle数据库下不能通过工具生成需要的子增减序列,之前的设计全落空了,只能另寻出路了,这时获得两个建议,从DRM中取得主键,另一个使用Java的内置方法,只要获得一个不重复的值即可。由于持久层改造成DRM管理尚未完成,所以采用了第二个方案,具体实现如下。
Oracle数据库
先在数据库建立一个自增序列。
create sequence seq_post_id
increment by 1
start with 1;
同时在Spring的配置文件中,增加一个Spring的自增键管理bean- org.springframework.jdbc.support.incrementer. OracleSequenceMaxValueIncrementer,设置数据库的自增序列名,在需要获取主键时,生成一个org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer类的实例,再通过调用这个实例的nextIntValue方法,获得主键。
Mysql数据库
需要再建一个表,新建一列,作为主键值的容器,同时在Spring的配置文件中加入Mysql的自增键管理bean- org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer,同时设置数据库自增键表的表名,列名,获得主键的方法和Oracle一样。
以上设计存在如下问题。
对数据库特性依赖比较高。
不同数据库的配置也不同,不能一劳永逸。
在测试时发现在oracle数据库下不能通过工具生成需要的子增减序列,之前的设计全落空了,只能另寻出路了,这时获得两个建议,从DRM中取得主键,另一个使用Java的内置方法,只要获得一个不重复的值即可。由于持久层改造成DRM管理尚未完成,所以采用了第二个方案,具体实现如下。
import java.rmi.server.UID;
String uid=new UID().toString();
uid=uid.replaceAll(":", "");
这里使用一个JDK内置类java.rmi.server.UID,它的作用是生成一个字符串序列,对产生它的主机来说为唯一的标识符,生成的值恰是可以作为主键,用这样的方法获得主键,解决了Spring管理带来的那两个问题。