@OrderColumn을 Board 엔티티에서 매핑하므로 Comment는 POSITION의 값을 알 수 없다. 그래서 Comment를 저장할 때는 POSITION 값이 저장되지 않는다. POSITION은 Board.comemnts의 위치 값이므로, 이 값을 사용해서 POSITION의 값을 UPDATE하는 SQL이 추가로 발생한다.
List를 변경하면 연관된 많은 위치 값을 변경해야 한다. 예를 들어 댓글2를 삭제하면 댓글3, 댓글4의 POSITOIN 값을 하나씩 줄이는 UPDATE SQL이 2번 추가로 실행된다.
중간에 POSITION 값이 없으면 조회한 List에는 null이 보관된다. 예를 들어 POSITION 값이 [0, 2, 3]이 되어서 중간에 1이 없는 경우, List를 조회하면 1번 위치에 null 값이 보관된다.
PostLoad: 엔티티가 영속성 컨텍스트에 조회된 직후 또는 refresh를 호출한 후(2차 캐시에 저장되어 있어도 호출된다)
PrePersist: persist() 메소드를 호출해서 엔티티를 영속성 컨텍스트에 관리하기 직전에 호출된다. 식별자 생성 전략을 사용한 경우 엔티티에 식별자는 아직 존재하지 않는다. 새로운 인스턴스를 merge할 때도 수행된다.
PreUpdate: flush나 commit을 호출해서 엔티티를 데이터베이스에 수정하기 직전에 호출된다.
PreRemove: remove() 메소드를 호출해서 엔티티를 영속성 컨텍스트에서 삭제하기 직전에 호출된다. 또한 삭제 명령어로 영속성 전이가 일어날 때도 호출된다. orphanRemoval에 대해서는 flush나 commit시에 호출된다.
PostPersist: flush나 commit을 호출해서 엔티티를 데이터베이스에 저장한 직후에 호출된다. 식별자가 항상 존재한다. 참고로 식별자 생성 전략이 IDENTITY면 식별자를 생성하기 위해 persistn()를 호출하면서 데이터베이스에 해당 엔티티를 저장하므로 이때는 persist()를 호출한 직후에 바로 PostPersist가 호출된다.
PostUpdate: flsuh나 commit을 호출해서 엔티티를 데이터베이스에 수정한 직후에 호출된다.
PostRemove: flush나 commit을 호출해서 엔티티를 데이터베이스에 삭제한 직후에 호출된다.