私はSQL、H2を使用しており、UsertableのIDがauto_incrementedになるようにしようとしています。H2 sql インターフェイスですべての sql コマンドを試しましたが、うまくいきませんでした。
alter table user alter column int not null auto_increment;
この一般的なものは機能していません。auto_incement の JPA の注釈はありますか?
どうもありがとう
私はSQL、H2を使用しており、UsertableのIDがauto_incrementedになるようにしようとしています。H2 sql インターフェイスですべての sql コマンドを試しましたが、うまくいきませんでした。
alter table user alter column int not null auto_increment;
この一般的なものは機能していません。auto_incement の JPA の注釈はありますか?
どうもありがとう
JPAアノテーション@Id
と@GeneratedValue
IDを使用する必要があります。
SQLは有効に見えます。エラーメッセージを投稿できますか?
私も同じ問題を抱えていました。根本原因が同じかどうかはわかりません。しかし、完全に論理的な説明が得られました。だからここに私が発見したものがあります。
まず、自動インクリメント キーを作成するには、少なくとも 2 つの異なる方法があります。
クラス情報を保持する 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 列の自動インクリメント フィールド定義が保持されていないことに気付くでしょう。
物事を行うまったく異なる方法は、質問で示したように、すべてを注釈に入れることです。
@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>
テーブルは破棄され、再生成されました。