2012-07-23 81 views
0

我在Grails/PostgreSql应用程序中拥有POJO域类,并且我试图为其ID标识postgres序列生成器。Grails POJO域类的序列生成器映射

在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的生成,所有该域的我得到:

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应用程序的数据库运行CRUD操作。

任何提示将不胜感激。

回答

2

有两个问题:

  1. GenerationType.AUTO(永久性的提供者选择策略自由)时GenerationType.SEQUENCE似乎是优选的使用和
  2. 错误的假设flight_idgenerator = "flight_id"直接指数据库序列的名称,实际上是指:(直接来自文档):

    用作指定的主键生成器的名称编辑在 SequenceGenerator或TableGenerator注释

应该做些什么正在改变策略,以GenerationType.SEQUENCE和定义SequenceGenerator这是与数据库序列一致,确实有相同的价值name属性一样,是值GeneratedValue中的generator属性。