JPA 데이터 타입 분류 엔티티 타입 @Entity로 정의하는 객체 데이터가 변해도 식별자로 지속해서 추적이 가능하다. 값 타입 단순히 값으로 사용하는 자바 기본 타입이나 객체 별도의 식별자(id)가 없고 값만 존재하므로 변경시 추적이 불가하다. 값 타입 분류 기본 값 타입 원시타입(int, boolean..), 래핑 타입(String, Integer..) 생명주기를 엔티티에 의존한다. 회원을 삭제하면 이름, 나이 필드도 함께 삭제된다. 값 타입은 공유하면 안된다. 회원 이름 변경 시 다른 회원의 이름도 함께 변경되면 안된다. → 불변 객체로 만들어야 함. 그렇기 때문에 자바의 기본 타입은 항상 값을 복사하는 특징이 있다. 래퍼 클래스는 기본 타입이 아니지만 특수한 케이스로 변경할 수 없다. 임베디드 타..
개요 JPA가 사용하는 프록시와 지연로딩, 즉시로딩에 대하여 알아보고 영속성 전이에 대한 개념과 영속성 전이를 이용해 고아객체를 제거하는 방법에 대하여 이해한다. 프록시 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 지연로딩 이라하고 이때 실제 엔티티 객체 대신 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라 한다. @Getter @Setter @Entity public class Game { @Id @GeneratedValue private Long id; private String name; } Game game = new Game(); game.setName("game"); em.persist(game); em.flush(); em.clear();; ..
상속 관계 매핑 1. 조인 전략 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없으므로 타입을 구분하는 컬럼을 추가해야 한다. (기본값은 DTYPE) @Entity @Inheritance(strategy=IngeritanceType.JOINED) //매핑 전략 지정 @DiscriminatorColumn(name="DTYPE") //부모 클래스에 구분 칼럼 지정 public abstract class Item { @Id @GeneratedValue @Column(name="ITEM_ID") private Long id; private String name; private int..
다대일[N:1] 다대일 단방향 회원 엔티티 @Entity public class Member { @Id @Column(name = "member_id") @GeneratedValue private Long id; @ManyToOne @JoinColumn(name = "team_id") private Team team; } 팀 엔티티 @Entity public class Team { @Id @Column(name = "team_id") @GeneratedValue private Long id; private String name; } @ManyToOne 어노테이션을 사용하여 다대일 단방향 매핑 @JoinColumn 어노테이션을 사용하여 회원 테이블의 Team_Id와 회원 엔티티의 team 필드를 매핑 다대..
개요 연관관계 매핑에 대하여 이해하자 핵심 키워드 방향 : 단방향, 양방향이 있다. 방향은 객체 관계에만 존재하고 테이블 관계는 항상 양방향이다. 객체 관계에서는 한쪽만 참조를 한다면 단방향, 양쪽 다 참조를 한다면 양방향이 된다. 다중성 : 다대일, 일대다, 일대일, 다대다가 있다. 여러명의 회원이 하나의 팀에 속할 수 있다면 회원과 팀은 다대일 관계이다. 반대로 팀과 회원은 일대다 관계이다. 단방향 연관관계 - @MayToOne 객체관계에서는 Member에게 Team을 참조하여 Member -> Team 으로의 단방향 관계를 맺게하고 데이터베이스는 Member 테이블에 Team의 외래키를 추가하여 양방향 관계를 맺게 한다. @Entity public class Member { @Id @Genterat..
개요 자주 쓰이는 매핑 어노테이션에 대해 알아보자 스키마 자동 생성 JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다. persistence.xml에 다음 속성을 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다. 해당 속성에 대한 옵션은 아래와 같다 옵션 설명 create 기존 테이블을 삭제하고 새로 생성한다. DROP + CREATE create-drop create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다 update 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다 validate 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다 no..
JPA에서 가장 중요한 2가지 객체와 관계형 데이터베이스 매핑하기 영속성 컨텍스트 영속성 컨텍스트란 정의 '엔티티를 영구 저장하는 환경' EntityManager로 접근이 가능하다 - em.persist(Entity); 실제로 DB에 접근하기전에 영속성 컨텍스트 환경에 엔티티를 영속화 하겠다는 의미 EntityManager와의 관계 기본적으로 하나의 엔티티 매니저가 생성되면 1:1로 하나의 영속성 컨텍스트가 생성된다 하지만 스프링 프레임워크와 같은 컨테이너 환경의 JPA에서는 여러 엔티티 매니저가 하나의 영속성 컨텍스트를 공유하게 된다 컨테이너 환경에서의 JPA 컨테이너를 사용하는 스프링과 같은 환경에서는 개발자가 EntityManager를 생성하지 않고 컨테이너가 생성 관리하게된다 스프링은 싱글톤 기반..
개요 예제 프로젝트를 통해 Hibernate를 사용해보자 Persistence.xml 설정 : META-INF/persistence.xml 파일을 통해 설정 정보를 관리한다. 속성을 보면 java 표준 속성(javax.persistence), 하이버네이트 속성(hibernate)로 나뉜다. 하이버네이트에서는 데이터베이스의 방언을 설정하게 된다. 데이터베이스 방언(=dialect)란? SQL 표준을 지키지 않거나, 특정 데이터베이스만의 고유한 기능 2. 애플리케이션에서 사용하기 public class JpaMain { public static void main(String[] args) { //엔티티 매니저 팩토리 생성 EntityManagerFactory emf = Persistence.createEnt..