인프런 - 스프링 부트와 JPA 활용1 by 김영한 을 기반으로 작성된 글입니다.
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
변경포인트가 많으면 유지보수가 어렵다
실무에서 즉시 로딩을 사용하지 말자
@ManyToOne(fetch = FetchType.EAGER)
, @OneToOne(fetch = FetchType.EAGER)
@ManyToOne(fetch = FetchType.LAZY)
, @OneToOne(fetch = FetchType.LAZY)
@ManyToOne
@OneToOne
의 default는 즉시 로딩 👉 직접 지연 로딩 설정
@OneToMany
@ManyToMany
의 default는 지연 로딩
NullPointerException 문제에서 안전
하이버네이트가 영속화 하여 하이버네이트가 관리하는 내장 컬렉션으로 변경
👉 하이버네이트 내부 매커니즘에 문제 발생
이럴때는?! 해당 커넥션을 객체 생성시 초기화 하고 변경하지 않는 것이 안전
💻 코드1
private List<Order> orders;
public Member(){
orders = new ArrayList<>();
}
💻 코드2
private List<Order> orders = new ArrayList<>();
코드1처럼 사용하지 말고 코드2 처럼 사용하는 것이 안전
SpringPhysicalNamingStrategy
cascade
를 입력하면💻 코드 (Order.java)
public class Order {
/*(생략)*/
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = LAZY, cascade = CascadeType.ALL )
@JoinColumn(name="delivery_id")
private Delivery delivery;
💻 코드 (Order.java)
public void setMember(Member member) {
this.member = member;
member.getOrders().add(this);
}
public void addOrderItem(OrderItem orderItem){
orderItems.add(orderItem);
orderItem.setOrder(this);
}
public void setDelivery(Delivery delivery){
this.delivery = delivery;
delivery.setOrder(this);
}
💻 코드 (Category.java)
public void addChildCategory(Category child){
this.child.add(child);
child.setParent(this);
영속화 된다는 말이 잘 이해가 되지 않아 뜻을 정확하게 정리하기 위해 찾아보았다
간단하게 정리해보자!
영속성 컨텍스트 (Persistence Context) : 영속성 + 컨텍스트
영속성 컨텍스트는 엔티티 매니저를 통해 접근 할 수 있다
EntityManagerFactory
에서 생성된 EntityManager
로
Entity
를 관리 할 때 영속성 컨텍스트에 엔티티를 보관하고 관리한다
EntityManager
메소드 이용