私は休止状態のようなフレームワークを使用することをお勧めします。
フレームワークを使用できない場合は、@PrePersist
とを使用して履歴トラッキングを実装することができます。エンティティは@PrePersist
と
に変更された場合の履歴エントリを作成する必要があれば
エンティティが実際の状態セーブ・ロードされると
はhttps://stackoverflow.com/a/19313914/974186
- チェックを参照してください
たとえば
@Entity
public class Person implements Serializable {
@Id
private Integer id;
private String firstname;
private String lastname;
/**
*/
@OneToMany(mappedBy = "person", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private List<PersonHistory> personHistories = new ArrayList<>();
@Transient
private transient Person previousPersonState;
protected Person() {
// JPA only
}
public Person(String firstname, String lastname) {
this.firstname = firstname;
this.lastname = lastname;
}
@PostLoad
private void saveState() {
this.previousPersonState = SerializationUtils.clone(this); // from apache commons-lang
}
@PrePersist
@PreUpdate
private void updateHistory() {
if (personChanged()) {
PersonHistory personHistory = new PersonHistory(previousPersonState);
personHistories.add(personHistory);
}
}
public boolean personChanged() {
if (previousPersonState == null) {
return false;
}
if (getFirstname() != null ? !getFirstname().equals(previousPersonState.getFirstname()) : previousPersonState.getFirstname() != null)
return false;
if (getLastname() != null ? !getLastname().equals(previousPersonState.getLastname()) : previousPersonState.getLastname() != null)
return false;
return true;
}
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
}
とPersonHistoryはあなたがhttp://hibernate.org/orm/envers/を見てみたいとhttp://www.baeldung.com/かもしれません。この
@Entity
public class PersonHistory {
@Id
private Integer id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(nullable = false)
private Person person;
private String firstname;
private String lastname;
private Date createdDate;
protected PersonHistory(){
// default constructor for JPA
}
public PersonHistory(Person person) {
this.person = Objects.requireNonNull(person);
this.firstname = person.getFirstname();
this.lastname = person.getLastname();
createdDate = new Date();
}
public Date getCreatedDate() {
return createdDate;
}
public String getFirstname() {
return firstname;
}
public String getLastname() {
return lastname;
}
}
のようになります。 database-auditing-jpaです。 –
これは私がする必要があるものです。しかし、任意の休止状態/ jpa関連apisを使用せずに..私はそれをシンプルなコアのJavaモジュールを使用して記述する必要があります。それを設計するためのアプローチは何ですか? –