私はSpring Boot + Rest + Jpaで作業しています。従業員エンティティ(empId、salary、age、location役割、経験)の列を変更するには、古い変更と新しい変更を追跡し、列が変更された監査テーブルに入力する必要があります。更新されたエンティティと古いエンティティを比較し、更新された値のみをデータベースに格納する方法
public EmployeeEntity update(int empId, EmployeeEntity employeeEntity) {
em = emf.createEntityManager();
EmployeeEntity beforeObj = em.find(EmployeeEntity .class,empId);
try {
em.getTransaction().begin();
em.merge(employeeEntity);
em.getTransaction().commit();
}
finally {
em.close();
}
return employeeEntity;
}
は、だから今は、例えば更新されている唯一の給与と場所があるためので、私はそれらと更新を追跡する必要があり、beforeObj(古い値を持つ従業員エンティティ)とemployeeEntity(更新された値)を持つエンティティを持っています監査テーブル最小限のトランザクションしか発生しないため、Enversやその他のJPAツールを使用するよりも簡単に行う必要があります。同じのために必要な
@Entity
@Table(name = "TEMPLOYEE")
public class EmployeeEntity implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "EMP_NO")
private int EMP_NO;
@Column(name = "SALARY_VAL")
private int SALARY_VA;
@Column(name = "ROLE_NAME")
private String ROLE_NAME;
@Column(name = "EXPERIENCE")
private int EXPERIENCE;
@Column(name = "LOCATION")
private String LOCATION;
// Getters and Setters
洞察:
これは私のエンティティクラスです。
回答に努力していただきます。 – DinaMike
私はこの質問にも興味があります。つまり、すべてのフィールドを追跡する場合は、オブジェクトとして(文字列、倍精度などを処理するために)oldValueおよびnewValueを持つことを検討し、changeType列挙リストをすべてのフィールドに含める必要がありますか? 'OneToMany'関係のために、私はそれがむしろ 'add'と' remove'操作についてだと考えます。私は正しいですか? – Al1
それが 'String'の理由は、それをデータベースの特定の列にマップする必要があるからです。 'String'を' int'に置くことはできないので、 'String'を使い、そのデータ型が何であっても何らかの文字列表現を使用しなければなりません。これは主にドキュメンテーションのためのものであり、おそらく情報では何もしない変更ログを表示していることに注意してください。コレクションの場合、通常は追加と削除をログに記録します。同じオブジェクトのバージョン/リビジョンを通して、これを解決するもう1つの方法があります。私は私の答えを更新します。 – Tobb