アノテーション付きのhibernateを使用するj2eeアプリケーションがあります。pojoクラスのIdフィールドに注釈を付けて、自動インクリメントまたは自動生成として設定するにはどうすればよいですか。Beanを追加する際に、Beanのそのフィールドをnullのままにしますか?
回答:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
永続化するときはnull
(0
)のままにします。(/ラッパーnull
を使用する場合)Integer
Long
場合によっては、AUTO
戦略がまたはにではなくSEQUENCE
ラーテンに解決されるため、手動でまたはに設定することをお勧めします(基盤となるデータベースによって異なります)。IDENTITY
TABLE
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 (?, ?, ?, ?, ?)
ご参考までに
mysql * auto_increment *列を持つデータベースのnetbeansNew Entity Classesを使用すると、次のアノテーションを持つ属性が作成されます。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
@NotNull
private Integer id;
これは、列がnullであってはならないという同じエラーを私に与えていたので、属性をnullのままにして@NotNull注釈を削除しただけで、機能します!
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;
自動インクリメントする数値列がある場合は、columnDefinition
直接設定するオプションがあります。これには、Hibernateなしで使用された場合でも、スキーマが値を自動生成するという利点があります。ただし、これによりコードがデータベース固有になる可能性があります。
import javax.persistence.Column;
@Column(columnDefinition = "serial") // postgresql
PKがSerial型の場合、Informixテーブルの戦略を検索するために、このSOの質問で誰かが「バンプ」した場合。
私はこれがうまくいくことを発見しました...例として。
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "special_serial_pk")
private Integer special_serial_pk;
このために仕事にあなたが行うときに確認してくださいsession.SaveOrUpdateを使用すると、列の値渡しspecial_serial_pkの NULLを 。
私の場合は私がやるHTML POSTとJSONをそのように...
{
"special_serial_pk": null, //<-- Field to be incremented
"specialcolumn1": 1,
"specialcolumn2": "I love to code",
"specialcolumn3": true
}