データベースにデータを保持して削除する Web サービスがあります。データベースで、どのユーザー名がデータベースのどの行に触れたかを追跡したい。各テーブルには、保存するユーザー名の列があります (必要に応じて列を更新してください)。テーブルには、トランザクションのユーザー ID を取得し、挿入を試みたユーザー名とパスワードでそのテーブルを更新するトリガーもあります。ユーザー名(クライアントから渡される)を取得し、JPAがデータを永続化するときにそのユーザー名がテーブルにスローされるように、ある種のJPAオブジェクトを更新できるオープンJPAの方法はありますか?
1 に答える
1
最もクリーンな方法の 1 つは、エンティティに共通の「マップされた」スーパークラス@PrePersist
を実装し、アノテーション付きのメソッドを使用してフィールドに入力することです。
@MappedSuperclass
public class AuditedEntity {
@Id protected Integer id;
protected String lastUpdatedBy;
// Setters and getters here
@PreUpdate
@PrePersist
public void onChange() {
String user = .... // Do whatever is needed to get the current user
setLastUpdatedBy(user);
}
}
@Entity
public class Employee extends AuditedEntity {
// ....
}
別のオプションは、別のリスナーを使用することです。
public interface AuditedEntity {
public static void setLastUpdatedBy(String username);
}
@Entity
@EntityListeners({ MyLogger.class, ... })
public class Employee implements AuditedEntity {
// ...
}
public class MyLogger {
@PreUpdate
@PrePersist
public void onChange(Object o) {
if(o instanceof AuditedEntity) {
String user = .... // Do whatever is needed to get the current user
((AuditedEntity) o).setLastUpdatedBy(user);
}
}
@PostPersist
@PostUpdate
public void logChange(Object o) {
// Log the successful operation
}
}
于 2012-08-27T19:54:10.653 に答える