[Hibernate] 특정값에 대하여 자동으로 값 삽입하기 Hibernate EntityListeners
프로그램 자료/Java & Spring 2018. 12. 10. 11:14출처1 : https://gs.saro.me/dev?tn=514
개발환경
hibernate 5.2
spring boot 2.0
개발을 진행하다보니 관리해줘야하는 값들이 종종있다.
예를 들어 createDate, updateDate 등이 있다.
나 같은 경우는 추가적으로 릴레이션으로 관리되는 테이블에도 사용하는데, 예를 들면 시간 형식(Time)을 관리하기 쉽게 String으로 받아왔다가 다시 넣는다.
근데 이 때 String을 Time 형식에 저장하려고 하면 종종 오류가 나는데 Time형식의 column은 nullable로 되어있어 String.empty를 넣으면 null로 들어가야 할 때 이다.
그 때! 저장하기 전에 String.empty 값을 null로 만들어주니 편하더라.
처음엔 서비스에서 조절을 했었는데 그러지 않아도 될 것 같다.
1. PostLoad : 엔티티가 영속성 컨텍스트에 조회된 직후 또는 refresh를 호출한 후
2. PrePersist : persist() 메서드를 호출해서 엔티티를 영속성컨텍스트에 관리하기 직전에 호출 된다. 식별자 생성 전략을 사용한 경우 엔티티에 식별자는 아직 존재 하지 않는다. 새로운 인스턴스를 merge할 때도 수행된다.
3. PreUpdate : flush나 commit을 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출된다.
4. PreRemove : remove() 메서드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출된다. 또한 삭제 명령어로 영속성 전이가 일어날 때도 호출 된다. orphanRemoval에 대해서는 flush나 commit시 호출 된다.
5. Postpersist : flush나 commit을 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출된다. 식별자가 항상 존재한다. 참고로 식별자 생성 전략이 IDENTITY면 식별자를 생성하기 위해 persist()를 호출한 직후에 바로 Postpersist가 호출 된다.
6. PostUpdate : flush나 commit을 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출 된다.
7. PostRemove : flush나 commit을 호출해서 엔티티를 데이터베이스에 삭제한 직후에 호출된다.
@Entity
@Getter
@Setter
@Table(name = "test_table")
public class Test_table implements Serializable {
private static final long serialVersionUID = 2878926893809162962L;
@Id
@Column(columnDefinition = "BINARY(16)", name = "Id")
@GenericGenerator(name = "customUuid", strategy = "com.motolies.model.util.CustomUUIDGenerator")
@GeneratedValue(generator = "customUuid")
private byte[] id;
@Column(name = "CreateDate", columnDefinition = "TIMESTAMP(6)", nullable = false)
private java.sql.Timestamp createDate;
@Column(name = "UpdateDate", columnDefinition = "TIMESTAMP(6)", nullable = false)
private java.sql.Timestamp updateDate;
@PrePersist
protected void onCreate() {
// 처음 저장시에만 호출
createDate = Common.getUtcTimestamp();
}
@PreUpdate
protected void onUpdate() {
// 처음 저장시 및 업데이트 시 호출
updateDate = Common.getUtcTimestamp();
}
}