에러 메세지는 다음과 같습니다. Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query jpql로 변경을 처리한 경우에는 말씀하신 것처럼 repository 계층에서 따로 @Transactional을 붙여주지 않아도 잘 동작합니다. native query를 이용한 부분에서만 위 에러가 발생하고 있습니다.
빠른 답변 감사드립니다. 분명히 서비스 계층에서 붙여줬었는데도 불구하고 에러가 발생해서 Custom Repository 메소드에도 추가로 @Transactional을 붙여줬었습니다. - 서비스 계층 코드 @Transactional public void saveCallMessages (String senderIp , String cid , List messages) { ... callMessageRepository .bulkInsert(callMessages) ; } - Repository 계층 코드 @Override @Transactional public int bulkInsert (List messages) { StringBuilder sb = new StringBuilder( "insert into call_messages ( ... ) values " ) ; ... em .createNativeQuery(sb.toString()).executeUpdate() ; return messages.size() ; } 에러 메세지를 복사해 놓았어야 했는데 죄송합니다ㅜㅜ
추가 질문이 있습니다. getMembers().forEach( m.leaveTeam() ) 같은 경우를 Bulk update를 하고 싶으면, 결국 이 부분은 로직에서 빠지고 외부에서 별도로 처리를 해야 할까요? JPA로 가면서 DDD까지 공부가 필요해지는 것 같아서 어려운 부분도 있네요ㅎㅎ
다른 질문을 여기에 이어서 하고자 합니다. Member -> Team 단방향 N:1 관계라고 가정하고, Team에서 해당 팀을 비활성화하는 disable()이라는 메소드를 만들고자 합니다. 이 때, 팀원 Member들의 team을 모두 null로 변경하고자 하는데, 로직 처리를 어디서 어떻게 하는 것이 좋은 구조인지 궁금합니다. 양방향 관계로 바꾼다고 해도 Team은 연관관계의 주인이 아니기 때문에, Team의 getMembers()를 iteration하면서 member.changeTeam(null)을 하는건 맞지 않을 것 같습니다.