본문 바로가기

jpa

(5)
Lazy Initialize Exception 방어코드 뷰에 필요한 엔티티를 미리 로딩해줌으로서 지연 로딩 익셉션에 대한 방어를 할 수있다.1. Global Fetch 전략 수정가장 간단한 방법으로 글로벌 페치를 fetch = FetchType.EAGER 로 잡아주면 즉시로딩을 하기 때문에 지연 로딩에 대한 문제가 발생하지 않는다. 단점해당 엔티티가 필요없는 경우에도 무조건 로딩한다.N+1 Problem 발생 가능성 2. JPQL 페치 조인기존 //JPQL select o from Order o //SQL select * from orderJPQL 페치 조인 사용 //JPQL select o from Order o join fetch o.orderItem //SQL select o.*, i.* from Order o join OrderItem i on o.o..
스프링 JPA 그리고 LazyInitializeException 1. 스프링 컨테이너의 기본전략 스프링 컨테이너를 사용하면, 컨테이너가 트랜잭션과 영속성 컨텍스트를 관리해준다. 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.이는 다음을 의미한다.트랜잭션의 범위 = 영속성 컨텍스트의 생존 범위 즉 , 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고, 트랜잭션이 종료될 때 영속성 컨텍스트를 종료한다 2. @Transactional 어노테이션 @Transactional을 통해 동작하는 스프링 트랜잭션 AOP는 대상 메소드를 호출하기전에 트랜잭션을 시작하고 메소드가 종료되면 커밋을 하면서 종료한다. 이때 트랜잭션을 커밋하기 직전 JPA는 영속성 컨텍스트를 플러시해서 변경 내용을 데이타베이스에 반영한다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생..
EntityManager 와 EntityManagerFactory Entity Manger FactoryEntity Manger 를 생성하기 위해서는 persistence.xml의 설정 정보를 사용해서 Entity Manger Factory를 먼저 생성해야한다.EntityManagerFactory emf = Psersistence.createEntityManagerFactory("name");Entity Manager Factory 생성 비용은 굉장히 크기 때문에, 애플리케이션 전체에 걸쳐 한 번 생성하고 재사용 해야 한다.Entity Manager Entity Manager Factory 에서 Entity Manager를 생성한다.EntityManager em = emf.createEntityManager();JPA 대부분의 기능은 Entity Manger 가 제공한..
CASCADE, 영속성 전이 특정 엔티티를 영속 상태로 만들 때, 연관 엔티티를 함께 영속 상태로 만들고 싶은 경우 영속성 전이를 사용하면 된다.JPA 에서는 CASCADE 옵션으로 사용할 수 있다. 즉, CASCADE 설정으로 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장할 수 있다. 아래 Team 과 Member의 엔티티를 보자. @Getter @Setter @Entity public class Team { @Id @GeneratedValue private String teamId; @OneToMany(mappedBy = "team", cascade = CascadeType.PERSIST) private List member = Lists.newArrayList(); }@Getter @Setter @Entity public ..
지연로딩과 즉시로딩 다음과 같은 엔티티 관계가 있다고 하자 Member : Team = N : 1 Member Entity@Getter @Setter @Entity public class Member { @Column(name = "memberName") private String memberName; @ManyToOne @JoinColumn(name = "teamId") private Team team; }Team Entity@Getter @Setter @Entity public class Team { @Column(name = "teamId") private String teamId; } 즉시 로딩 : 엔티티 조회 시 연관된 엔티티도 함께 조회.@ManyToOne(fetch = FetchType.EAGER) // 또는 ..