Hibernateとアノテーションを使用するj2eeアプリケーションがあります。 pojoクラスのIdフィールドに注釈を付けて、自動インクリメントまたは自動生成として設定するにはどうすればよいですか。そして、Beanを追加する際に、Bean内のそのフィールドをnullのままにしますか?
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
永続化するときはnull
(0
)のままにします。 (null
/Integer
ラッパーを使用する場合は、Long
)
場合によっては、AUTO
戦略がSEQUENCE
またはIDENTITY
よりもTABLE
rathenに解決されるため、手動でIDENTITY
またはTABLE
に設定することもできます(基礎となるデータベースによって異なります)。
SEQUENCE
+ シーケンス名の指定が機能したようです。
次のようにしてください:-
@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 (?, ?, ?, ?, ?)
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 を確認してください。
ご参考までに
netbeansmysql * auto_increment *列でデータベースからの新しいエンティティークラスを使用して、次の注釈付きの属性:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;
これは、列がnullであってはならないという同じエラーを私に与えていたので、属性をnullのままにして@NotNull注釈を削除しましたが、機能します!
自動インクリメントする数値列がある場合は、columnDefinition
を直接設定するオプションになる可能性があります。これには、休止状態なしで使用された場合でもスキーマが値を自動生成するという利点があります。ただし、これにより、コードがデータベース固有になる場合があります。
import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
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
}
Netbeansを使用して、mysql auto_increment列を持つデータベースの新しいエンティティクラスを作成すると、次のhibernate.hbm.xmlの属性が作成されます。id is auto increment