원본 본문으로 이동하기

Hibernate @EntityListeners : 1. 리스너를 통해 자동으로 값 삽입하기

박용서 - Hibernate @EntityListeners 시리즈 - javax.persistence.EntityListeners 는 하이버네이트 전용이 아닌, - javax persistence 규격 이지만 이 강의에서는 하이버네이트를 기준으로 설명합니다. 1. 리스너를 통해 자동으로 값 삽입하기 - https://gs.saro.me/#!m=elec&jn=826 2. 어노테이션을 이용한 활용 - https://gs.saro.me/#!m=elec&jn=827 서론 하이버네이트를 사용하다가 Entity를 통해 자동으로 값을 넣어주고 싶었습니다. 예를들어 last modified date 라던지 create / join date 같은 경우입니다. @Entity(name="account") @Table(name="account") @Data @Getter @Setter @ToString public class Account { @Id @Column(name="sn", nullable=false, unique=true) @SequenceGenerator(name="account_sn_seq", sequenceName="account_sn_seq", allocationSize=1) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="account_sn_seq") long sn; // 생략... // 자동으로 가입날짜를 삽입 @Column(name="join_date", nullable=false) Date joinDate; // 자동으로 최근 수정날짜를 삽입 @Column(name = "last_date", nullable = false) Date lastDate; @OneToMany(mappedBy="sn", fetch = FetchType.LAZY) List<AccountRole> roles; } 구글링을 하다보면 @CreatedDate, @UpdateTimestamp, @LastModifiedBy 등 이 나오지만 작동되지 않았습니다. - 하이버네이트가 지원하지 않는다는 말도 있고 어쩌면 필자가 저걸 어떻게 실행시켜야할지 모르는 것 일 수도 있습니다. (혹시 성공하면 댓글을 남겨주세요!!) 그래서 @EntityListeners 를 사용하도록 하겠습니다. Entity Listener 란? 엔티티를 DB에 적용하기 이전 이후에 커스텀 콜백을 요청할 수 있는 어노테이션 입니다. 예를들어 아래와같이 업데이트 이전에 Account.lastDate 를 교체해 줄 수 있습니다. public class AccountListener { // 업데이트 이전 @PreUpdate // Account 클래스에서 작동. void onUpdate(Account account) { // 마지막 날짜를 현재값으로 넣어준다. account.setLastDate(new Date()); } } 그리고 Account 클래스는 다음과 같이 추가해줍니다. // {} 를 사용하여 복수개의 클래스를 지정 할 수 있습니다. @EntityListeners(AccountListener.class) // 생략 public class Account { // 생략 } 이렇게하면 update 가 일어나기 전에 Account.lastDate 를 현재시간으로 바꾸어 주게 됩니다. Entity Listener / 콜백옵션 @PrePersist manager persist 의해 처음 호출될 때 실행됩니다. @PostPersist manager persist 에 의해 실행되고 불립니다. SQL INSERT 이후에 대응될 수 있습니다. @PostLoad 로드 이후에 불립니다. SQL SELECT 이후에 대응될 수 있습니다. @PreUpdate SQL UPDATE 이전에 불립니다. @PostUpdate SQL UPDATE 이후에 불립니다. @PreRemove SQL DELETE 이전에 불립니다. @PostRemove SQL DELETE 이후에 불립니다. - 스프링 자바 Hibernate