출처1 : https://gs.saro.me/dev?tn=514

출처2 : http://blog.naver.com/PostView.nhn?blogId=goddes4&logNo=30188688186&parentCategoryNo=&categoryNo=60&viewDate=&isShowPopularPosts=false&from=postView


개발환경

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();

    }

   

}

 



Posted by motolies
,