2

私はこのように注釈が付けられたクラスを持っています:

@Entity
@Table(name="MYENTITY")
@SequenceGenerator(name="CODE_GEN", sequenceName="SEQ_NAME")
public class MyEntity {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="CODE_GEN")    
    @Column(name="CODE", nullable=false)
    private int code;

hibernate3.6.10とOracle10gDialectを使用しています。データベースはOracle10gです。シーケンスが作成されました:

CREATE SEQUENCE SCHEMA_NAME.SEQ_NAME
  START WITH 0
  MAXVALUE 999999999999999999999999999
  MINVALUE 0
  NOCYCLE
  NOCACHE
  NOORDER;
COMMIT;

MyEntityクラスを永続化しようとすると、次のようになります。

Hibernate: select hibernate_sequence.nextval from dual
19-jul-2012 13:31:24 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 2289, SQLState: 42000
19-jul-2012 13:31:24 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: ORA-02289: sequence not exist

@SequenceGenerator(sequenceName = "SEQ_NAME")でシーケンス名を宣言しているのに、hibernateが常にhibernate_sequenceにアクセスしようとするのはなぜですか?注釈に何か問題がありますか?

私は多くの組み合わせを試しましたが、Hibernateは常にシーケンス名を無視し、「hibernate_sequence」を探します。ところで、このアプリはSQLServerに対しても実行する必要があるため、GenerationType.AUTOを使用しています。

ありがとう...

4

2 に答える 2

3

このバージョンはアノテーション@SequenceGeneratorを完全にサポートしていないようであるため、私はついにhibernate独自のアノテーションを使用して独自のシーケンスを使用できるようになりました。したがって、コードは次のようになります。

@Entity
@Table(name="MYENTITY")
@GenericGenerator(name="CODE_GEN", strategy = "native", parameters = 
                  { @Parameter(name="sequence", value="SEQ_NAME")})
public class MyEntity {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="CODE_GEN")    
    @Column(name="CODE", nullable=false)
    private int code;

@SequenceGeneratorを@GenericGeneratorに置き換えるとうまくいきました。

于 2012-07-20T13:26:58.517 に答える
0

JPA仕様によれば、@SequenceGeneratorはクラスまたは主キーフィールドにアノテーションを付けることができます。それをフィールドに移動して、それが機能するかどうかを確認することは価値があると思います。

于 2012-07-19T20:29:17.423 に答える