persist()는 JPA에서 쓰레드 증가에 따라 EntityManagerFactory 에서 생성되는 EntityManager 의 메소드.
void persist(Object entity)
// Make an instance managed and persistent.
리턴 타입이 void로, 저장된 객체의 id, 객체 등이 리턴되지 않는다.
내가 평소에 많이 사용하던 save()는 Spring Data JPA에서 제공하는 CrudRepository의 메소드.
<S extends T> S save(S entity)
// Saves a given entity. Use the returned instance for further operations as the save operation might have changed the entity instance completely.
Spring Data JPA 역시 내부적으로 EntityManager를 사용하기 때문에 그 동작 방식은 동일하다고 볼 수 있다고 한다. 하지만 해당 Entity를 리턴하고, EntityManager와는 PersistentContext를 공유하지 않는다.
항상 @ManyToOne Annotation에 덧붙이지만 정확한 사용은 하지 않고있었던 것 같아서 든 의문, 책의 설명과 같은 방식으로 사용하고 있던 것은 맞았고, @ManyToOne 컬럼의 주인인 경우 사용이 가능하며, 로딩 시점에 FetchType이 LAZY인 객체는 프록시로 가져와서 실제 객체를 사용할 때 데이터베이스에 접근하여 조회하게 된다. 반대는 즉시로딩, FetchType=EAGER로, 1개의 쿼리로 인해 N개의 쿼리가 추가로 발생하는 N+1 Problem이 발생한다. default가 EAGER이기 때문에 실무에서는 일반적으로 LAZY로 사용하는 것이 효율적이다.