본문 바로가기

JPA19

[JPA] CASCASDE 옵션 & orphanRemoval CASCADE의 옵션으로 ALL PERSIST REMOVE .... 등이 있는데 ALL에 대해서만 설명하겠다. CACADE는 엔티티가 영속화될때, 해당되는 엔티티도 영속화 할 것인지 옵션으로 정할 수있게한다. @OneToMany 와 @ManyToOne 둘다 cascade 옵션을 가지고 있다. 영속화에 대해서 편리함을 제공한다. 하지만 영속화를 전이할때, 전이대상이 되는 객체가 null 이거나 등 예상치 못한 부작용이 있을 수있다. 그래서 나름의 기준을 정하는 것이 좋다. 1. 단일 소유여야 한다. 나만 소유하면 되지 다른 객체들도 소유하고 있으면 곤란하다. 2. 생명주기가 같아야 한다. 내가 사라지면 내가 가진 소유물도 사라져야한다. 하지만 사라지지 않아도 되는데 cascade를 쓰면 문제가 있다. (고.. 2020. 8. 6.
[JPA] 프록시 (Proxy) 객체 & fetch = EAGER & LAZY class Order{ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="user_id") private User user; .... } 여기서 @ManyToOne은 알겠는데 fetch 에서 LAZY는 무엇인가?? EAGER 는 무엇인가?? 왜 이런 설정이 있는가?? 보통 프록시라고 하면 프록시서버에 관한 내용이 많이 나온다. 단어만 가지고 생각하면 프록시는 "가짜" 와 관련된 느낌의 단어다. 그렇다. 프록시 객체는 가짜객체다. 프록시 객체는 실제 클래스의 객체를 상속 받은 객체이다. 그리고 실제 객체에 대한 Target 즉 참조를 가지고 있다. 초기의 프록시 객체는 이러한 참조만 가지고 있고 실제 내용은 텅텅비어있다. 이런 프록시 객체는 왜 만드는 것인가? .. 2020. 8. 6.
[JPA] @Inheritance , @DiscriminatorValue, @DiscriminatorColumn 전략 설명에 앞서 테이블을 정의해 보자. 상속관계의 매핑을 위한 3가지 방법이 있다. 1.JOINED 2.SINGLE_TABLE 3.TABLE_PER_CLASS 1. JOINED @Inheritance(strategy = InheritanceType.JOINED) 이는 가장 정규화된 테이블로 관리를 해준다. 조회할때 항상 조인해서 가져오기 때문에 성능이 떨어지지만, 그외 저장효율이나 유지보수가 용이하다. @DIscriminatorColumn이 디폴트가 아니지만 설정해 주는 것이 좋다. 2. SINGLE_TABLE 이는 하나의 테이블에 모든 속성을 다 집어넣는다. 조회에서 좋은 성능을 보인다. 단순한 상속관계에서 주로 많이 쓴다. 또한 DiscriminatorColumn 이 기본으로 깔려서 들어간다. 3.TAB.. 2020. 8. 6.
[JPA] @MappedSuperClass 란? 엔티티를 살펴보면 상당히 공통적인 필드들이 많다. 언제 생성되었는지 언제 수정되었는지 등등 ... 이러한 필드들을 공통적으로 관리할 수 없을까 ?? 해서 나온것이 @MappedSuperClass다. @MappedSuperClass 는 단순히 매핑정보만 제공할 뿐이며 그이상 그이하도 아니다. 따라서 abstract로 추상클래스로 선언하는 경우가 많다. 보통의 엔티티에서는 @MappedSuperClass를 상속받아서 쓰면된다. 그렇다고 상속관계의 매핑이 전혀 아니다. 헷갈리면 안된다. 예) @MappedSuperClass abstract class 시간찍기{ 업데이트시간, 생성시간, } class 객체 extends 시간찍기{ 이름; 나이; ..... } 위처럼 생성했을 때, 데이터베이스에서 보면 객체에는 .. 2020. 8. 6.
[JPA] @ManyToOne , @OneToMany, @JoinColumn 데이터 베이스공부를 하다보면 조인이라는 개념을 배운다. 우리가 아는 가장 기본적인 조인은 두개의 테이블의 공통적인 요소를 끌고 오는 것이다. 예를 들어 과일상자테이블과 과일들의 테이블이 있다고 하자. 과일상자 기본키 과일상자 이름 1 상자1 2 상자2 과일의 기본키 과일상자의 기본키(왜래키) 과일 이름 3 1 사과 4 1 포도 5 1 배 6 2 오렌지 7 2 바나나 과일상자와 과일의 관계는 OneToMany이다. 두개의 테이블을 조인하면 어떻게 될까? 과일상자를 왼쪽으로 두고 left join을 했다고 가정하자. 과일상자 기본키 과일상자 이름 과일의 기본키 과일 이름 1 상자1 3 사과 1 상자1 4 포도 1 상자1 5 배 2 상자2 6 오렌지 2 상자2 7 바나나 이렇게 해서 "상자1" 과 "상자2" .. 2020. 8. 6.
[JPA] @Id, @GenerateValue 의 전략 보통 AUTO 로 설정하는데, 공부도 할겸 정리해본다. GenerateValue의 전략은 3가지가 있다. 1. IDENTITY 2. SEQUENCE 3. TABLE 1. IDENTITY 기본키를 생성하는 작업을 전적으로 데이터베이스에 위임하는 것이다. 즉 데이터베이스와 동일시 하는 것. 이러한 특징때문에 persist 명령후에 엔티티의 pk를 바로 알수가 없다. 왜냐하면 데이터베이스에 한번 갔다 와야 pk를 알 수 있기 때문이다. 그래서 persist를 하면 바로 insert쿼리가 전송된다. 원래는 flush작업으로 그동안 쌓여있던 sql 쿼리들이 전송되면서 동기화가 된다. IDENTITY전략에서만 유일하게 persist 작업과 동시에 쿼리를 날린다. 2. SEQUENCE persist 하면 데이터베이스.. 2020. 8. 6.
[JPA] 엔티티 업데이트 엔티티 매니저의 merge라는 명령어가 존재한다. 하지만 기본적으로 JPA에서 영속성 컨텍스트의 엔티티가 변경이되면 이를 감지한다. 따라서 따로 업데이트를 하는 쿼리를 날리지 않아도 된다. 2020. 8. 6.
[JPA] EntityManager 명령어 정리 find(class이름,기본키) 해당하는 객체를 영속성 컨텍스트로 가져온다. 영속성 컨텍스트에 이미 객체가 있다면 객체를 그대로 반환한다. 객체가 프록시객체라면 프록시 객체를 반환한다. (동일성 보장) persist(object) 객체를 영속화 한다. 영속성 컨텍스트에 객체를 저장한다. remove(object) 영속성 컨텍스트에서 객체를 제거한다. createQuery(jpql) jpql을 sql로 쿼리를 생성해 데이터베이스에 전송한다. detach(object) 영속상태의 객체를 비영속상태로 만든다. clear 영속성 컨텍스트를 비운다. flush 영속성 컨텍스트의 내용과 데이터베이스의 내용을 동기화한다. close 영속성컨텍스트를 더이상 관리하지 않는다. 2020. 8. 6.
[JPA] 영속성과 영속성 컨텍스트 영속성 컨텍스트에 관한 언급은 공식사이트에도 있다. https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html EntityManager (Java(TM) EE 7 Specification APIs) Interface used to interact with the persistence context. An EntityManager instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity i.. 2020. 8. 6.