0

データベースにデータを保持して削除する Web サービスがあります。データベースで、どのユーザー名がデータベースのどの行に触れたかを追跡したい。各テーブルには、保存するユーザー名の列があります (必要に応じて列を更新してください)。テーブルには、トランザクションのユーザー ID を取得し、挿入を試みたユーザー名とパスワードでそのテーブルを更新するトリガーもあります。ユーザー名(クライアントから渡される)を取得し、JPAがデータを永続化するときにそのユーザー名がテーブルにスローされるように、ある種のJPAオブジェクトを更新できるオープンJPAの方法はありますか?

4

1 に答える 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 に答える