본문 바로가기
반응형

JPA11

[JPA] 변경감지와 병합(merge) 준영속 엔티티 식별자가 존재하지만 영속성 컨텍스트가 더는 관리하지 않는 엔티티 - JPA가 관리하지 않는다 - 변경감지가 일어나지 않는다 준영속 엔티티 수정하는 방법 1. 변경 감지 기능 사용 1) id 식별자를 이용해서 기존 entity를 조회 2) 조회한 엔티티는 영속성 컨텍스트에서 관리됨 3) 조회한 엔티티에 setter를 이용해서 값을 넣어주면 트랜잭션 커밋 시점에 flush를 날리면서 변경 감지 작동 2. 병합(merge) 사용 em.merge(item); JPA가 준영속 엔티티의 식별자 값으로 영속성 컨텍스트에서 entity를 찾고 없으면 DB에서 조회 후 모든 필드를 바꿔줌 (1번에 적어놓은 과정을 모두 JPA가 알아서 해줌) 주의! 병합을 쓸 경우 모든 필드를 교체 [꿀팁 번외편] 데이터를.. 2022. 10. 26.
[JPA] 지연로딩과 조회 성능 최적화 2 - fetch join, DTO로 조회 1. fetch join 을 이용해서 entity 조회 후 DTO로 변환 1 + N 문제 해결도 하고, 조인을 통해 쿼리 한번으로 조회 가능 - Controller 코드 (엔티티로 조회해 왔기 때문에 DTO로 수정 후 반환) @GetMapping("/api/v3/simple-orders") public List ordersV3() { List orders = orderRepository.findAllWithMemberDelivery(); List result = orders.stream() .map(o->new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class SimpleOrderDto { privat.. 2022. 4. 19.
[JPA] Hibernate Query Language(HQL) Projection / 하이버네이트 쿼리 언어 프로젝션 조회 / 특정 컬럼만 조회 / 예문 하이버네이트쿼리(hql)로 조회를 해올 때 엔티티(전체 컬럼)조회와 특정 컬럼만 조회해오는 방법!! # 엔티티 조회 entityManager.createQuery 로 select 를 해올 때 엔티티 기준으로 조회해오는 것은 쉽다 // Member 엔티티 조회 List entityList = entityManager.createQuery("select m from Member m", Member.class).getResultList(); // Member의 Team 엔티티 조회 List teamEntityList = entityManager.createQuery("select m.team from Member m", Member.class).getResultList(); List teamEntityList.. 2022. 4. 11.
[JPA] 연관관계 영속성 전이 CASCADE # CASCADE - 부모 엔티티에서 자식 엔티티로 상태를 전이하는 것 ex. 부모 엔티티 저장할 때 자식 엔티티도 함께 저장, 게시글과 첨부파일 - Parent와 Child가 라이프사이클이 동일할 때, Child를 소유하는 Parent가 하나일 때 사용하는 것이 좋음 # CascadeType ALL - 엔티티의 모든 상태 전이 PERSIST - 엔티티 persiste(영속) 전이 REMOVE - 삭제 전이 MERGE - merge 전이 REFRESH - refresh 전이 DETACH - detach 전이 [Hibernate ORM 6.0.0 User Guide 예제 코드] @Entity public class Person { @Id private Long id; private String name; .. 2022. 4. 7.
[JPA] 지연 로딩 LAZY , 즉시 로딩 EAGER # 지연 로딩 가급적 지연 로딩 사용! 연관된 엔티티를 프록시 객체로 가져옴 실제 사용할 때 프록시 초기화(디비에서 조회해서 가져옴) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; # 즉시 로딩 주로 연관된 엔티티를 함께 조회해서 사용할 때 사용 조인 쿼리로 조회 ★@ManyToOne, @OneToOne => 기본이 즉시로딩이므로 Lazy로 설정해줘야함★ @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "TEAM_ID") private Team team; ★즉시 로딩은 JPQL에서 N+1 문제 일으킴★ JPQL은 SQL로 번역해서 실행함 (최적화X) -.. 2022. 4. 6.
[JPA] 프록시 entityManager.find() 데이터베이스 조회를 통해 실제 엔티티 객체 반환 entityManager.getReference() 데이터베이스 조회를 통하지 않고 프록시 엔티티 객체 반환 실제 사용시에 DB를 조회해서 실제 Entity 생성(프록시 객체 초기화) ex. member.getUsername() # 프록시 특징 - 실제 클래스를 상속 받아서 만들어짐 - 실제 클래스와 겉모양이 같음 - 사용하는 입장에서는 진짜 객체인지 프록시 객체인지 구분하지 않고 사용하면 됨 - 프록시 객체는 실제 객체의 참조(target)를 보관 - 프록시 객체 호출하면 실제 target의 메소드 호출 - 처음 사용할 때 한 번만 초기화 - 프록시 객체 초기화 : 프록시가 실제 엔티티가 되는 것이 아니라 실제 엔티티.. 2022. 4. 6.