@GeneratedValueタイプIDを使用すると、(実際に書き込む前に)その値を事前に知ることはできません。ただし、Beanを永続化すると、そのBeanインスタンスにidフィールドが入力され、追加のクエリを実行しなくても取得できます。言い換えれば:
MyEntiry myEnt = new MyEntity(); //the id field is null now
entityManager.persist(myEnt);//the id field is populated in myEnt now
Long id = myEnt.getId();
また、EntityManager
の方法によっても異なります が構成されている場合、そのIDを取得する前に、最初にトランザクションを(手動で)コミットする必要がある場合もあります。
コメントごとに更新
保存や更新の前にエンティティをインターセプトして何かを実行したい場合は、JPAライフサイクルリスナーを使用できます(JPAバージョン2を使用している場合):リスナーとコールバックを使用してJPAライフサイクルイベントを処理します。
基本的に、validate()
を作成できます Beanのメソッドで、@PrePersist
で注釈を付けます および@PreUpdate
その中で検証を行います(コードが空の場合は、IDの値に設定します)
2番目のコメントごとの更新
はい、正直なところ、今考えたところです。IDが自動生成された場合、pre-persistイベントの後にデータが入力される可能性があるため、pre-persistコードを実行しても、IDが何であるかがわかりません。 (この例では、IDにリンクするのは自動生成されないが、手動で設定されることに気付くかもしれません)この場合にできることは、エンティティにブールフィールドを追加することです(@Transient
で注釈が付けられています)。 したがって、永続化されません)isCodeEmpty
と呼ばれます (特に初期化されていない場合、デフォルトではfalseです)。次に、@PrePersist
で コードフィールドの値が空かどうかを確認し、空の場合はブール値をtrueに設定する注釈付きメソッド。次に、setId(...)
をリファクタリングします (idフィールドの設定は別として)このブール値をチェックし、trueの場合、コードフィールドの値をidフィールドの値に設定するようなメソッド:
public class YourEntity {
@Transient
private boolean isCodeEmpty;
public void setId(Whatever id) {
this.id = id;
if(isCodeEmpty) {
this.code = id;
//if necessary:
//this.isCodeEmpty = false;
}
}
@PrePersist
public void validate() {
if(code == null || code.isEmpty()) {
isCodeEmpty = true;
}
}
}