728x90

프록시 3

(@Scheduled 관련) 스케쥴러 관련 메소드안에 JPA 저장하는 메서드가 같이 있을 경우 저장이 안되는 오류

스케쥴러 메소드안에 JPA 저장하는 메서드가 같이 있을 경우, 저장이 안되는 오류가 발생하였다. 스케쥴러가 돌면서 JPA의 프록시에 있는 값에 영향을 준다(프록시 초기화)고 한다. 또한, 트랜잭션 매니저가 @EnableTransactionManagement를 통해 DataSourceTransactionManager로 구성된 경우, 하이버네이트의 begin() 메소드가 AbstractTransactionImpl을 부르지 않는다고 한다. 해결 → @Scheduled 클래스와 @Transacional이 있는 xxService를 분리하여 해결한다. //예제 class schedule { @Schedule go() { service.call(); } } @Transactional class xxService { ..

Spring 2023.08.24

페치 조인과 일반 조인의 차이(feat. 연관된 엔티티 함께 조회)

페치 조인을 사용하지 않고 조인만 사용하면 어떻게 될까 select t-- 내부 조인 JPQL from Team t join t.members m where t.name = '팀A' SELECT--실행된 SQL T.* FROM TEAM T INNER JOIN MEMBER M ON T.ID=M.TEAM_ID WHERE T.NAME = '팀A' JPQL에서 팀과 회원 컬렉션을 조인했으므로 회원 컬렉션도 함께 조회할 것으로 기대해선 안 된다. 실행된 SQL의 SELECT 절을 보면 팀만 조회하고 조인했던 회원은 전혀 조회하지 않는다. JPQL은 결과를 반환할 때 연관관계까지 고려하지 않는다. 단지 SELECT 절에 지정한 엔티티만 조회할 뿐이다. 따라서 팀 엔티티만 조회하고 연관된 회원 컬렉션은 조회하지 않는..

JPA 2022.06.15

지연 로딩(Lazy Loading) - feat. 프록시

지연 로딩을 사용하려면 @ManyToOne의 fetch 속성을 FetchType.Lazy로 지정한다. @Entity public class Member { //지연 로딩 설정 //... @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; //... } Member member = em.find(Member.class, "member1"); //지연 로딩 실행 코드 Team team = member.getTeam(); //객체 그래프 탐색 team.getName(); //팀 객체 실제 사용 em.find(Member.class, "member1")를 호출하면 회원만 조회하고 팀은 조회하지 않는다. 대신에 같이..

JPA 2022.06.14
728x90