如何把Domain Class的主键设为Sequence?

使用Sequence作为主键是使用Oracle数据库的常见需求,那么如何在Grails工程中设置Domain Class的主键为Sequence呢?答案当然还是自定义映射。

Hibernate已经提供了满足这一需求的做法:org.hibernate.id.enhanced.SequenceStyleGenerator,现在只要找到可以自定义Domain Class主键的方法就行了。这种需求对于Grails来说简直就是小菜一碟,参见下例(摘自这篇文章):

class FirstClass {
  static mapping = {
    id(generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator',
       params: [sequence_name: 'first_seq', initial_value: 50])
  }
  ...
}

class SecondClass {
  static mapping = {
    id(generator: 'org.hibernate.id.enhanced.SequenceStyleGenerator',
       params: [sequence_name: 'second_seq', initial_value: 1000])
  }
  ...
}

这里值得注意的是,在定义ID产生器时需要指定该ID产生器所需的参数。对于此例而言就是sequence_name和initial_value,尤其是sequence_name,如果不指定的话,这两个ID产生器都将使用同一个默认的值:hibernate_sequence,结果可想而知。

关于SequenceStyleGenerator的其他内容,请参见Hibernate对应的文档

By foxgem - Posted on 07 三月 2010