Hibernate自動インクリメントID


86

アノテーション付きのhibernateを使用するj2eeアプリケーションがあります。pojoクラスのIdフィールドに注釈を付けて、自動インクリメントまたは自動生成として設定するにはどうすればよいですか。Beanを追加する際に、Beanのそのフィールドをnullのままにしますか?

回答:


161
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

永続化するときはnull0)のままにします。(/ラッパーnullを使用する場合)IntegerLong

場合によっては、AUTO戦略がまたはにではなくSEQUENCEラーテンに解決されるため、手動でまたはに設定することをお勧めします(基盤となるデータベースによって異なります)。IDENTITYTABLEIDENTITYTABLE

それはそうですSEQUENCE+シーケンス名を指定するあなたのために働いています。


私のIDは文字列型です。何に設定しますか。このエラーが発生するためです。原因:javax.el.E​​LException:org.hibernate.exception.SQLGrammarException:次のシーケンス値を取得できませんでした
セドリック

4
自動インクリメントとは、インクリメントされる数値であることを意味します。文字列をインクリメントすることはできません。列をintにする
Bozho 2010年

データベースのmyid列はタイプnumberです。そして、私はすでにpojoのidをintに変更しました。エラーシーケンスが存在しないことが
わかり

2
Oracleの場合、SEQUENCEは自動インクリメントに最も近いものです。Hibernateにスキーマを生成させない限り、事前にシーケンスを作成する必要があります。ある時点で複数のデータベースをサポートする可能性があると思われる場合は、TABLEを使用してください。
Brian Deterling 2010年

2
IDを使用しないでください。OracleはIDをサポートしておらず、シーケンスをサポートしています。
JuanZe 2010年

33

次のようにしてください:-

@Id
@GenericGenerator(name="kaugen" , strategy="increment")
@GeneratedValue(generator="kaugen")
@Column(name="proj_id")
  public Integer getId() {
    return id;
 }

kaugenの代わりに任意の名前を使用できます。それはうまくいきました、私はコンソールで以下のクエリを見ることができました

Hibernate: select max(proj_id) from javaproj
Hibernate: insert into javaproj (AUTH_email, AUTH_firstName, AUTH_lastName, projname,         proj_id) values (?, ?, ?, ?, ?)

これは私のために働きます。ただし、ID値を設定することはできません。整数またはintでsetIDを試しましたが、いつでもmaxを使用します。私は何をすべきか?
desudesudesu 2012年

使用@GenericGenerator(名=「incrementId」、戦略は=「割り当て」)@GeneratedValue(発電機=「incrementId」)それはあなたのIDを渡さない場合、それは0になります。あなたのown.Butによって設定されたIDにあなたをできるようになります。
ラビカント2014

@Kaushik Lelestrategy = "increment"は休止状態の組み込みインクリメント戦略ですか?これらのSEQUENCE、IDENTITY、AUTO、TABLEのどれに該当しますか?
気分が良く、プログラミング

テーブル内の7億件のレコードはどうですか?これは、インデックスがないと問題になる可能性があります
user2171669 2015年

10

ご参考までに

mysql * auto_increment *列を持つデータベースのnetbeansNew Entity Classesを使用すると、次のアノテーションを持つ属性が作成されます。

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;

これは、列がnullであってはならないという同じエラーを私に与えていたので、属性をnullのままにして@NotNull注釈を削除しただけで、機能します!


7

Hibernateは、5種類の識別子生成戦略を定義しています。

AUTO-基になるDBに応じて、ID列、シーケンス、またはテーブルのいずれか

TABLE -IDを保持するテーブル

IDENTITY -ID列

SEQUENCE -シーケンス

IDコピー–IDは別のエンティティからコピーされます

テーブルの使用例

@Id
@GeneratedValue(strategy=GenerationType.TABLE , generator="employee_generator")
@TableGenerator(name="employee_generator", 
                table="pk_table", 
                pkColumnName="name", 
                valueColumnName="value",                            
                allocationSize=100) 
@Column(name="employee_id")
private Long employeeId;

詳細については、リンクを確認してください


4

自動インクリメントする数値列がある場合は、columnDefinition直接設定するオプションがあります。これには、Hibernateなしで使用された場合でも、スキーマが値を自動生成するという利点があります。ただし、これによりコードがデータベース固有になる可能性があります。

import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql

MySQLは@Column(columnDefinition = "integer auto_increment")
yeralin19年

1

PKSerial型の場合、Informixテーブルの戦略を検索するために、このSOの質問で誰かが「バンプ」した場合。

私はこれがうまくいくことを発見しました...例として。

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;

このために仕事にあなたが行うときに確認してくださいsession.SaveOrUpdateを使用すると、列の値渡しspecial_serial_pkの NULLを

私の場合は私がやるHTML POSTJSONをそのように...

{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}

0

mysql auto_increment列を持つデータベースからのnetbeans新しいエンティティクラスを使用して、次のhibernate.hbm.xmlを持つ属性を作成します。idは自動インクリメントです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.