web-dev-qa-db-ja.com

Hibernate自動インクリメントID

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

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

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

場合によっては、AUTO戦略がSEQUENCEまたはIDENTITYよりもTABLE rathenに解決されるため、手動でIDENTITYまたはTABLEに設定することもできます(基礎となるデータベースによって異なります)。

SEQUENCE + シーケンス名の指定が機能したようです。

146
Bozho

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

@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 (?, ?, ?, ?, ?)
31
Kaushik Lele

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

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

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

IDENTITY-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;

詳細については、 link を確認してください。

7
user2530633

ご参考までに

netbeansmysql * auto_increment *列でデータベースからの新しいエンティティークラスを使用して、次の注釈付きの属性:

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

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

7
jmoreira

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

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

Informix table PKがtype Serialの場合、戦略の検索でこのSO質問で誰かが「バンプ」する場合=。

例としてこれが機能することがわかりました。

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

これが機能するためには、session.SaveOrUpdateのときに列の値を渡すspecial_serial_pkNULLを確認してください。

私の場合、HTMLPOST with JSONのように...

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

Netbeansを使用して、mysql auto_increment列を持つデータベースの新しいエンティティクラスを作成すると、次のhibernate.hbm.xmlの属性が作成されます。id is auto increment

0
Ankur Patel