jpa.persist()
jpa.find()
member.setName()
jpa.remove()
같은 트랜잭션 안에서는 같은 엔티티를 반환한다.
SQL문 한번만 실행
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
트랜잭션을 커밋할 때까지 Insert SQL을 모은다.
JDBC BATCH SQL기능을 사용해서 한번에 SQL전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
Update/ Delete의 경우 로우 락 시간을 최소화해준다.
transaction.begin(); // [트랜잭션] 시작
changeMember(memberA);
deleteMember(memberB);
비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.
//커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
지연로딩 : 객체가 실제 사용될 때 로딩
즉시로딩 : Join SQL로 한번에 연관된 객체까지 미리 조회
→ 즉시로딩의 경우 한번에 조회를 하기때문에 평소에는 지연로딩상태로 두는 편이다.
→ 하지만, 어차피 모든 데이터가 필요하다면 간혹 즉시로딩도 사용한다.