PreUpdate`コール@のEclipseLink JPAは `永続ありません
-
18-09-2019 - |
質問
私は、StackOverflowの上のいくつかの類似の質問に走ったソリューションを試してみましたが、答えを見つけることができませんでした。
私はいくつかのエンティティに最終変更時刻を設定するには、かなり一般的なJPA戦略を使用しています。 @PreUpdate
でメソッドをタグ付けし、それが現在の時間に等しいそれらを設定でき、その後、カラムとフィールドを設定します。
問題は、私はしかし、私のDBのログに、私は唯一のためにUPDATEが含まれていない変更されたフィールドを更新するためにSQL呼び出しを参照して、メソッドが呼び出されているとフィールドが更新されていることをデバッガで見ることができるということですタイムスタンプフィールドます。
さらに@PrePersist
だけ@PreUpdate
exibitsこの振る舞い、完璧に動作します。
私がこれまでに発見した最も近い説明はこれである<のhref =「http://www.eclipse.org/forums/index.php?t=msg&goto=499756&S=3bcc64b0e0822e7707f2ce0b616d92df」のrel =「nofollowをnoreferrer」 > LINK でます。
で同様の質問:#1725699および#1745890
私はのGlassFish v2の互換性のためのEclipseLink JPA v2とV1を使用しています。
IはEntityListener
注釈を持つエンティティクラスに取り付け@EntityListener
をエンティティ・クラス内のメソッドに直接、両方のアノテーションを使用して、同様に試みてきた。
私は、これはEclipseLinkのバグである疑いがあるが、私はそれを証明することはできません。
バグかどうか、私は非常に多く、この単純な操作のように動作するでしょう。この実装に何か問題はありますか?これはEclipseLinkの既知の問題ですか?これは、JPAの既知の問題ですか?これを回避する方法はありますか?
データベースに行くとトリガを使用してのショートは、私のJavaコードはupdated_onタイムスタンプを設定してみましょうする代替パスがあるのでしょうか?
アドバイスしてくれてありがとう!
コードスニペットは以下の通り。
エンティティのフィールドます:
@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
@Column(name = "created_on")
@Temporal(TemporalType.TIMESTAMP)
private Date createdOn;
注釈付きの更新方法:
@PreUpdate
public void setUpdatedOn(Timestamped object) {
object.setUpdatedOn(new Date());
}
@PrePersist
public void setCreatedOn(Timestamped object) {
if (object.getCreatedOn()==null) {
object.setCreatedOn(new Date());
}
}
解決
あなたが提供するリンクは正確にあなたの状況を説明します@PreUpdateメソッドが呼び出されると@PreUpdate方法の変化はもはや検出されない前に、汚れのチェックのために、更新されたフィールドが検出されています。汚いチェックが大きなオブジェクトグラフに非常に高価になることができますので、これはおそらく、パフォーマンス上の理由のために行われます。あなたの選択は、プロバイダ固有のメカニズム(DescriptorEvent)を使用するか、休止状態に切り替えている今ようです。
他のヒント
Mybe少し遅れますが、これはバグではなく、情報の完全性のために文書化行動ます:
日付やカレンダーの種類が想定されているのしないのデフォルトで変更可能であることをそれは日またはカレンダー上のsetメソッドを呼び出すことが望まれる場合、マッピングは@Mutableになるように設定する必要があります。
日付とカレンダータイプでは世界的な永続プロパティ「eclipselink.temporal.mutable」も「真」に設定することができます。
ので、どちらかの注釈
@Mutable
@Column(name = "updated_on")
@Temporal(TemporalType.TIMESTAMP)
private Date updatedOn;
または定義
<property name="eclipselink.temporal.mutable" value="true" />
persistence.xmlで