[JPA] Hibernate Envers 오류 : Such mapping is possible, but has to be explicitly defined using @Audited
과제로 엔티티가 변경될 때 테이블에 기록하는 envers 라이브러리를 추가하고 변경된 부분을 반영하여 Application을 시작하였더니 다음과 같은 오류가 발생하였다.
여기서 조건은 한 Place 당 하나의 Review를 작성하게 했는데 이 과정에서 굳이 Place 변경 이력을 남길 필요가 없다 생각하여 User와 Review만 변경 이력을 조회하는 테이블을 생성하도록 고안하였다.
그러기 위해 dependency에 관련한 설정을 추가하였고, @Audited 어노테이션을 활용하여 테이블을 생성하긴 하였다.
처음이라 잘 몰라서 일단 되게 하기 위해 모든 Entity에 어노테이션을 추가하였고, 결과적으로 DB 테이블은 아래 사진과 같이 생성 되었다.
다른 엔티티에 대한 변경 이력은 불필요하다고 생각했고, 조금 더 변경하기 위해 추가적으로 검색을 해보니 연관관계에 있는 엔티티에 관련한 테이블을 생성하지 않기 위해서는 필드에 @Audited(targetAuditMode = NOT_AUDITED) 이렇게 추가를 해주면 된다고 한다. 그렇게 설정했는데 처음과 같은 오류가 났다.
오류가 발생된 지점을 다시 읽어보니 처음에 실행이 안되어서 모두 @Audited를 추가해 놓은 부분에서 그런거 같다.
오류 내용을 복사해 놓으면 아래와 같다.
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.MappingException: An audited relation from com.example.triple.domain.UserPlace.place to a not audited entity com.example.triple.domain.Place! Such mapping is possible, but has to be explicitly defined using @Audited(targetAuditMode = NOT_AUDITED).
User와 Place가 다대다 관계라 UserPlace라는 새로운 엔티티를 생성했었는데 그 부분에 NOT_AUDITED 조건을 추가해놓지 않아서 그런거 같다. 오류 발생하는 지점을 알았으니 수정해보겠다.
User 엔티티에서 다대다로 연결한 UserPlace 리스트 필드에 옵션을 추가하고 나머지 필요 없다고 느낀 부분에 @Audited를 모두 제거하였다. 그런데도 동일한 오류가 발생해서 검색을 해보니 일대일 관계는 처음 옵션을 적용하지만 일대다인 부분에서는 다르게 적용한다는 사실을 알게 되었다.
@AuditJoinTable을 추가하면 된다고 하는데 그런 어노테이션이 없었고, 라이브러리에서 가져올 수 없었다..ㅎㅎ
@NotAudited를 추가했고, 잘 생성된 것을 확인할 수 있었다.