JPA內部回調方法 內部回調方法是在實體類中定義的方法。例如,下面的實體類定義了所有支持的回調方法空的實現:
@Entity
public static class MyEntityWithCallbacks {
@PrePersist void onPrePersist() {}
@PostPersist void onPostPersist() {}
@PostLoad void onPostLoad() {}
@PreUpdate void onPreUpdate() {}
@PostUpdate void onPostUpdate() {}
@PreRemove void onPreRemove() {}
@PostRemove void onPostRemove() {}
}
內部回調方法應該總是返回void,並且沒有參數。他們可以有任何名稱和任何訪問級別(公共,受保護,包和私有),但不應該是靜態的。
的註釋指定時調用的回調方法:
@PrePersist - before a new entity is persisted (added to the EntityManager).
@PostPersist - after storing a new entity in the database (during commit or flush).
@PostLoad - after an entity has been retrieved from the database.
@PreUpdate - when an entity is identified as modified by the EntityManager.
@PostUpdate - after updating an entity in the database (during commit or flush).
@PreRemove - when an entity is marked for removal in the EntityManager.
@PostRemove - after deleting an entity from the database (during commit or flush).
實體類可以包括用於任何子集或生命週期事件的組合,但沒有爲同一事件多於一個回調方法回調方法。但是,通過用多個註釋標記多個回調事件,可以使用同一方法。
默認情況下,還會爲子類的實體對象調用超類實體類中的回調方法,除非該子類重寫該回調方法。
實施限制 爲避免觸發實體生命週期事件(仍在進行中)的原始數據庫操作發生衝突,回調方法不應調用EntityManager或Query方法,也不應訪問任何其他實體對象。
如果回調方法在活動事務中拋出異常,則事務被標記爲回滾,並且不會爲該操作調用更多回調方法。
嘿。當我測試時,我發現監聽器中的所有操作都在主操作的同一事務中。我使用@PostUpdate註釋來標記偵聽器。 – Scarlett 2012-04-12 07:01:23