9

私はSQL、H2を使用しており、UsertableのIDがauto_incrementedになるようにしようとしています。H2 sql インターフェイスですべての sql コマンドを試しましたが、うまくいきませんでした。

alter table user alter column int not null auto_increment;

この一般的なものは機能していません。auto_incement の JPA の注釈はありますか?

どうもありがとう

4

2 に答える 2

14

JPAアノテーション@Id@GeneratedValueIDを使用する必要があります。

SQLは有効に見えます。エラーメッセージを投稿できますか?

于 2012-07-02T21:18:09.083 に答える
7

私も同じ問題を抱えていました。根本原因が同じかどうかはわかりません。しかし、完全に論理的な説明が得られました。だからここに私が発見したものがあります。

まず、自動インクリメント キーを作成するには、少なくとも 2 つの異なる方法があります。

第 1 の方法: (xml)

クラス情報を保持する xml ベースの構成を使用している場合。次に、classname.hbm.xml ファイルに次のように記述します。

<id name="id">
    <generator class="sequence"><param name="sequence">my_id_seq</param</generator>
</id>

このファイルをインポートするには、hibernate.cfg.xml ファイルに次のようなものがあります:

<!--  Mapping files  -->
<mapping file="classname.hbm.xml"/>

しかしここで重要なことは、キーをインクリメントするのは実際には JAVA であるということです。テーブルの生成に使用された sql を確認すると、id 列の自動インクリメント フィールド定義が保持されていないことに気付くでしょう。

2番目の方法: (注釈)

物事を行うまったく異なる方法は、質問で示したように、すべてを注釈に入れることです。

@GeneratedValue(strategy=GenerationType.IDENTITY)

hibernate.cfg.xml ファイルには、次のようなものがあります。

<!--  Mapping files  -->
<mapping class="package.subpackage.MyClassName"/>

GenerationType.IDENTITY は実際にはデフォルト値であるため、それ自体を指定する必要はありません。ただし、今回はテーブルの生成方法が異なります。すなわち、次のとおりです。

CREATE CACHED TABLE PUBLIC.MYTABLENAME(
    ID INTEGER DEFAULT 
    (NEXT VALUE FOR PUBLIC.SYSTEM_SEQUENCE_9DE2A0D5_28F5_488F_9E4C_2878B3CDA72F) 
    NOT NULL NULL_TO_DEFAULT SEQUENCE
    PUBLIC.SYSTEM_SEQUENCE_9DE2A0D5_28F5_488F_9E4C_2878B3CDA72F, 
...
)

あはは!それは面白い。今回は、シーケンスの生成は JAVA によって実行されず、データベース自体によって実行されます。

何が悪かったのか:

もちろん、私たちは皆実験し、物事を試しています。最初に xml ファイルを使用することを決定し、その後注釈を使用することを決定した場合。もちろん、それはテーブルも再生成する必要があることを意味します。これを忘れると、doniyor のようにエラーが発生します。

修正方法:

次の行を hibernate.cfg.xml に追加して、アプリケーションを再起動するだけです。

<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">create</property>

テーブルは破棄され、再生成されました。

于 2013-07-11T12:50:17.430 に答える