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

解决方案 »

  1.   

    你这个好像就是一个 主键生成策略的问题。
    另外序列我一般都是自己手动建的,不知道默认的是什么。
    全部表公用一个序列的问题你可以这样来解决:
    如果没有指定sequence参数,则Hibernate会访问一个默认的sequence,是hibernate_sequence,我们也需要在数据库中建立这个sequence
    此外,sequence还可以有另外一个参数是paramters,可以查看Hibernate的API了解它的用法,见org.hibernate.id.SequenceGenerator
    调用数据库的sequence来生成主键,要设定序列名,不然hibernate无法找到:
    <param name="sequence">NAME_SEQ</param>最后,只是建议,主键使用默认的sequence生成就可以了,id在数据库表中不一定非得设为主键。
      

  2.   

    http://javainzhuzhu.iteye.com/blog/855130
      

  3.   


    我也看了很多pg资料,确实和oracle序列一样,同一个hbm文件,没办法和mysql,sqlserver共用,只好抽出来,在切换数据库时进行处理,对于hibernate映射的表,采用手动脚本中创建序列,hbm文件中用param指定序列。
      

  4.   

    你好。。我想问一下关于postgreSQL中在hibernate映射的问题,我在postgreSQL中的主键是serial,然后再映射文件中用seq好像不能使用,这个要这么处理?