엔티티 설계시 주의점
컬렉션은 필드에서 바로 초기화하는것이 null문제에서 안전하다.
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
이렇게 초기화하라는 의미임.
하이버 네이트는 엔티티를 영속화할때 컬렉션들을 래퍼해서 하이버네이트가 제공하는 내장 컬렉션으로 변경해버린다.
Member member = new Member();
System.out.println(member.getOrders().getClass());
em.persist(member); //영속화 하고 나면
System.out.println(member.getOrders().getClass());
//출력 결과
class java.util.ArrayList
class org.hibernate.collection.internal.PersistentBag //그냥 컬렉션이 아님.
하이버네이트가 기껏 바꿔놨는데, 만약 누군가가 다시 컬렉션에 생성자를 사용한다면? JPA가 의도한대로 절대로 동작하지 않는다. 따라서 컬렉션의 초기화는 엔티티 생성시 자동으로 하게끔 하고 절대 건들지 않도록 하는게 낫다.
이는 @Table애너테이션을 사용하지 않을때 관련된 내용이다.
하이버네이트만의 전략과 스프링부트가 하이버네이트를 사용할때의 전략이 다르다. (스프링부트가 하이버네이트 기본 매핑 전략을 변경해서 사용한다.)
하이버네이트는 엔티티의 필드명을 그대로 테이블명으로 사용한다.
스프링부트는 다음의 전략을 따른다.(DBA의 전통관례)
이밖에는 다음과 같음