목록JPA (14)
DOing
➰ CASCADE (영속성 전이) : 특정 엔티티를 영속상태로 만들 때 연관된 엔티티들도 영속상태들로 만들고 싶을때 사용한다. : 주의해야 하는 것은 연관관계랑은 아무런 상관이 없다는 것이다.⭐⭐ : ALL(모두 적용) PERSIST(영속) REMOVE(삭제) 등이 있다. 이 세개만 주로 쓴다. : PERSIST -> 하위 엔티티까지 영속성 전달한다. -> 저장시 라이프사이클을 맞추고 싶을때 사용한다. 상위 엔터티 저장할때 하위 엔터티도 저장한다. : REMOVE -> 같이 삭제하고 싶을때 : ALL -> 라이프사이클을 디 맞춰야 할때 @Entity public class Parent{ @Id @GeneratedValue private Long id; @OneToMany(mappedBy="parent",..
⌚ 지연 로딩(FetchType.LAZY) @Entity public class Member { @Id @GeneratedValue private Long id; @Column(name = "USERNAME") private String name; @ManyToOne(fetch = FetchType.EAGER) // 지연로딩 : 프록시객체 @JoinColumn(name = "TEAM_ID") private Team team; .. } - Entity를 처음 생성할때 - 실제로 객체를 조회할때 Team team = member.getTeam(); team.getName(); // 실제 team을 사용하는 시점에 프록시 초기화 이때 쿼리가 나간다. 단순히 getTeam()으로 가져올 때가 아니고 team에 ..
➰ 플러시 : 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것이다. : DB 트랜잭션이 커밋되면 플러시가 자동으로 발생된다. : 플러시가 발생하면 변경감지(Dirty Checking), 수정된 엔티티를 쓰기지연SQL저장소에 등록하고 쓰기지연SQL저장소의 쿼리를 DB에 전송한다. 쓰기지연SQL저장소에는 등록/수정/삭제 쿼리등 모두 담겨 있다. 그걸 한번에 보낸다. : 플러시는 영속성 컨텍스트를 비우는 것이 아니다!!⭐⭐ : 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화 하는 것이다.⭐⭐ : 보통 영속성 컨텍스트 주기와 트랜잭션 주기를 맞춘다. 트랜잭션이라는 작업단위가 중요하다 -> 커밋직전에만 동기화하면 된다!⭐ ➰ 영속성 컨텍스트를 플러시하는 방법 1. em.flush() : 직접 호출 - ..
영속성 컨텍스트의 이점 1. 1차 캐시 2. 동일성(identity) 보장 3. 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind) 4. 변경 감지(Dirty Checking) 5. 지연 로딩(Lazy Loading) 1. 1차 캐시에서 조회 1차 캐시에 Map이 있고 @id가 키이고 Entity가 값이다. DB를 바로 조회하는 것이 아니고 1차 캐시에 있는지를 확인한다. 만약 1차 캐시에 있다면 1차캐시에서 조회한다. 1-2. 1차캐시에 없다면, DB조회 * 참고 : Entity Manager(영속성 컨텍스트)는 DB트랜잭션단위로 만든다. JPA는 Entity를 조회만 하면 무조건 영속성 컨텍스트에 올린다. 2. 영속 엔티티의 동일성 보장 Member a = em.find..
영속성 컨텍스트? : 논리적인 개념으로 눈에 보이지 않는다. : 엔티티매니저를 통해서 영속성 컨텍스트에 접근한다. : 엔티티를 영속화한다. 엔티티 생명주기 1. 비영속(new/transient) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 2. 영속(managed) : 영속성 컨텍스트에 관리되는 상태 // 객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername(“회원1”); EntityManager em = emf.createEntityManager..
프로젝트에 연관관계를 적용하려고 하니, 즉시 로딩과 지연로딩의 문제와 cascade 문제가 연달아 터졌다. 이 둘을 제대로 이해하기 위해서 프록시 개념을 이해해보고 넘어가려고 한다. 👻 프록시 : 가짜 Entity 객체 1. 실제 Entity를 상속받아 만들어지기 때문에 겉모양은 실제 Entity와 같지만, 안에가 비어있다. : 상속은 하이버네이트가 내부적으로 프록시 라이브러리를 써서 만들어준다. 2. 사용자 입장에서는 진짜 객체인지, 프록시 객체인지 구분하지 않고 사용하면 된다.(이론상) 3. 프록시 객체에는 target이라는 실제 객체의 참조를 보관하고 있다. 그래서 프록시 객체를 호출하면 프록시 객체는 실제 객체의 메소드 호출 👻 프록시가 실제 객체를 호출하는 과정 1. 사용자가 member.get..