Grails POJO域类的序列生成器映射

时间:2012-07-23 01:25:46

标签: hibernate postgresql grails sequence pojo

我在Grails / PostgreSql应用程序中有POJO域类,我正在尝试将postgres序列生成器映射为其ID。

在POJO中:

@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "flight_id")
public long getId() {
    return id;
}

在Postgres中:

-- Sequence: flight_id

-- DROP SEQUENCE flight_id;

CREATE SEQUENCE flight_id
  INCREMENT 1
  MINVALUE 1n 
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;
ALTER TABLE flight_id
  OWNER TO postgres;

当我尝试为该域运行grails generate-all时,我得到:

 Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Unknown Id.generator: flight_id

除此之外,其他一切似乎都运转良好。我正在尝试使用Postres本机生成器,因此我可以选择针对独立于Grails应用程序的DB运行CRUD操作。

任何提示都将非常受欢迎。

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 当GenerationType.SEQUENCE似乎是首选时,GenerationType.AUTO(持久性提供程序可以自由选择策略)的使用
  2. 错误地假设flight_id中的generator = "flight_id"直接引用数据库序列的名称,当它实际引用时:(直接来自文档):

      

    要使用的主键生成器的名称   SequenceGenerator或TableGenerator注释

  3. 应该做的是将策略更改为GenerationType.SEQUENCE并定义与数据库序列一致的SequenceGenerator,并确保 name 属性的值相同GeneratedValue中 generator 属性的值。