1.项目数据库需要在mysql,sqlserver,postgresql中自由切换。
2.对于些表通过hibernate.hbm。xml进行映射。(其中对每张表中的唯一标示符为主键,为从0开始自增)。
在hbm文件中,使用id为long,<generate >为native(为了一个映射文件可以在三个数据库公用)。
这个时候问题出现了。在mysql,sqlserver中每张表的id为从0开始自增。但是在pg中映射出来的数据表没有序列,只有通过手动create table(id serial)时才会有表名_字段_seq序列。
3.ok到这个时候,发现数据库中通过hibernate映射的进行数据插入(手动创见表产生序列的表)时,id的值却为一个hibernate_sequence中next值,导致全部表公用一个序列。有什么解决方案吗?各位大大。如果在hbm中为每个id指定序列,那在mysql中又不回兼容了。hibernatejavaee
2.对于些表通过hibernate.hbm。xml进行映射。(其中对每张表中的唯一标示符为主键,为从0开始自增)。
在hbm文件中,使用id为long,<generate >为native(为了一个映射文件可以在三个数据库公用)。
这个时候问题出现了。在mysql,sqlserver中每张表的id为从0开始自增。但是在pg中映射出来的数据表没有序列,只有通过手动create table(id serial)时才会有表名_字段_seq序列。
3.ok到这个时候,发现数据库中通过hibernate映射的进行数据插入(手动创见表产生序列的表)时,id的值却为一个hibernate_sequence中next值,导致全部表公用一个序列。有什么解决方案吗?各位大大。如果在hbm中为每个id指定序列,那在mysql中又不回兼容了。hibernatejavaee
另外序列我一般都是自己手动建的,不知道默认的是什么。
全部表公用一个序列的问题你可以这样来解决:
如果没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence
此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator
调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
<param name="sequence">NAME_SEQ</param>最后,只是建议,主键使用默认的sequence生成就可以了,id在数据库表中不一定非得设为主键。
我也看了很多pg资料,确实和oracle序列一样,同一个hbm文件,没办法和mysql,sqlserver共用,只好抽出来,在切换数据库时进行处理,对于hibernate映射的表,采用手动脚本中创建序列,hbm文件中用param指定序列。