0

Grails / PostgreSqlアプリにPOJOドメインクラスがあり、postgresシーケンスgeneratorgをその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操作を実行するオプションがあります。

ヒントをいただければ幸いです。

4

1 に答える 1

2

2つの問題があります:

  1. GenerationType.SEQUENCEが優先され、
  2. flight_idinがデータベースシーケンスの名前を直接参照しているのに、実際には次のことを参照しているという誤った仮定generator = "flight_id":(ドキュメントから直接続く):

    SequenceGeneratorまたはTableGeneratorアノテーションで指定されているように使用する主キージェネレーターの名前

実行する必要があるのは、戦略をGenerationType.SEQUENCEに変更し、データベースシーケンスと整合性があり、GeneratedValueのジェネレーター属性の値と同じname属性の値を持つSequenceGeneratorを定義することです。

于 2012-07-23T06:24:03.930 に答える