JPA 42

[JAVA] JPA 다양한 연관관계 매핑

연관관계 매핑 시 고려사항 3가지 다중성 : 일대일, 일대다, 다대일, 다대다 단방향, 양방향 연관관계 주인 다중성 ※ 보통 일대다, 다대일 이런 경우 맨 앞에 있는 애가 연관관계 주인이다. 1. 다대일 외래키는 항상 다대일 중 '다' 쪽에 존재한다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 '다' 쪽이다. 양방향에서 '다' 쪽인 Member테이블이 Team 에 관한 외래키를 가지고 있으므로 연관관계의 주인이다. 2. 일대다 다대일 관계의 반대방향이다. 일대다에서는 엔티티를 하나 이상 참조 가능하므로 Collection, List, Map 중 하나 사용해야 한다. (실무에서 잘 사용하지 않는다.) '일' 이 연관관계의 주인이다. 2-1. 단방향 하나의 팀은 여러 회원을 참조 할 수 있다. (팀..

JAVA 2021.12.09

[JAVA] JPA 연관관계 매핑( 양방향 )

양방향 연관관계 @OneToMany, @ManyToOne 을 예로 들 수 있다. 객체에는 양방향이 없다. ( 단방향 두개를 잘 묶어서 양방향인 것 처럼 보이게 할 뿐! ) 그럼 객체의 경우 단방향 두개 중 외래 키 관리를 누가 해야할까?? → 연관관계의 주인(Owner) 가 외래키를 관리! 양방향 연관관계 매핑의 규칙 객체의 두 관계 중 하나를 연관 관계의 주인으로 지정( 외래키 소유주를 주인으로 하는 걸 권장 ) 일대 다 기준에서 보통 '다' 쪽이 연관관계의 주인이다. 연관관계 주인만이 외래 키를 관리(등록, 수정) 한다. ( 주인이 아닌 쪽은 읽기만 가능 ) 주인은 mappedBy 사용 불가 mappedBy 속성으로는 주인의 이름을 지정해준다. Member.java /* 연관관계 주인 */ packa..

JAVA 2021.11.17

[JAVA] JPA 연관관계 매핑( 단방향 )

핵심 : 객체지향스럽게 매핑하는 방법 예제 시나리오 - 회원과 팀이 있다. - 회원은 하나의 팀에만 소속될 수 있다. - 회원(N)과 팀(1)은 다대일 관계이다. 1. 객체를 테이블에 맞추어 모델링( 참조 대신 외래키를 그대로 가져와 사용한다. ) Member.java ( teamId 주목 ) @Entity public class Member { @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @Column(name = "TEAM_ID") private Long teamId; } JpaMain.java package hellojpa; import..

JAVA 2021.11.16

[JAVA] JPA 기본키 매핑

직접 할당 : @Id 자동생성 : @GeneratedValue @GeneratedValue 의 종류 1. IDENTITY 기본 키 생성은 데이터 베이스에 위임해줌 Mysql 의 auto_increment와 기능이 같다. 주로 Mysql , postgreSQL, sql server, DB2에서 사용 identity는 null이 DB에 날라오면 그때 ID 값을 생성하여 DB에 삽입해준다. 제약이 생김 : DB에 넣을때 까지 키 값을 모르기 때문에 1차 캐시에 넣어줄 수가 없다. 따라서 identity만 예외적으로 commit 하기 전 persist 에서 DB에 쿼리를 날려준다. @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; ..

JAVA 2021.11.11

[JAVA] JPA 필드와 컬럼 매핑

요구사항 회원은 일반회원과 관리자로 구분해야 한다. 회원 가입일과 수정일이 있어야 한다. 회원을 설명할 수 있는 필드가 있어야 한다. 이때 필드의 길이는 제한이 없다. 매핑 어노테이션 정리 1. @Column - name : 필드와 매핑할 테이블의 컬럼 이름 ( default = 객체의 필드 이름 ) - insertable, updatable : 등록, 변경 가능 여부 ( default = true ) // 수정 불가능 하게 하고 싶을 때 @Column(name = "name", updatable = false) private String username; - nullable(DDL) : null 값의 허용 여부 , false 시 not null 제약조건 붙음 - unique(DDL) : @Table 의..

JAVA 2021.11.10

[JAVA] JPA 엔티티 매핑 + DB 스키마 자동생성

@Entity @Entity가 붙은 클래스는 JPA가 관리한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 가 필수이다. ※ 주의사항 1. 기본 생성자가 필수이다. (파라미터가 없는 public 또는 protected 생성자) 2. final 클래스, enum, interface, inner 클래스 사용하지 않는다. 3. 저장할 필드에도 final을 사용하지 않는다. package hellojpa; import javax.persistence.Entity; import javax.persistence.Id; // Entity 이름은 기본으로 클래스 명으로 들어감 바꾸려면 -> Entity(name='test') // @Table(name = "MBR") 으로 테이블명을 바꿀수 있음 @Ent..

JAVA 2021.11.10

[JAVA] JPA 준영속 상태

준영속 상태 란? 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached) 된 것 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다. 준영속 상태로 만드는 방법 em.detach(entity) : 특정 엔티티만 준영속 상태 전환 em.clear() : 영속성 컨텍스트를 완전히 초기화 em.close() : 영속성 컨텍스트를 종료함 Member member = em.find(Member.class, 150L); member.setName("AAAAAAAAAA"); // 원래 같으면 find 에서 select후 setName에서 update쿼리가 생성되야하는데 // detach 선언으로 준영속상태가 되어 영속성 컨텍스트 기능을 상실 // 따라서 update는 실행되지 않는다. em.detach(mem..

JAVA 2021.11.09

[JAVA] JPA 플러시(flush)

플러시 발생 변경감지 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송( 등록, 수정, 삭제 쿼리 ) 보통 transaction.commit과 동시에 쿼리를 DB에 날리는데 내가 쿼리를 미리 보고싶거나, DB에 먼저 넣고 싶을때 사용! 아래 예시를 보면 commit이 실행되기 전에 insert문이 먼저 실행된다. Member member = new Member(200L, "member200"); em.persist(member); em.flush(); System.out.println("======================="); tx.commit(); // commit을 실행하면서 쿼리를 DB에 날림 ★ JPQL 쿼리 실행 시에는 플러시가 자동으로 실행된다..

JAVA 2021.11.09

[JAVA] JPA 영속성 관리

영속성 컨텍스트란? JPA를 이해하는데 가장 중요하다. 엔티티를 연구 저장하는 환경이라는 뜻이다. 영속성 컨텐스트는 눈에 보이는 것이 아니므로 EntityManager를 통해 접근한다. // DB에 저장하는게 아닌 엔티티를 영속성 컨텍스트라는 곳에 저장하는것 EntityManager.persist(entity); 1. 비영속 상태 : JPA와 관련없음(EntityManager와 상관없음 + 사용하지않음) // 비영속 상태 Member member = new Member(); member.setId(100L); member.setName("HelloJPA"); 2. 영속 상태 : EntityManager 사용 시점부터 영속 상태에 들어감 → 영속성 컨텍스트에 들어감 // 영속 상태 em.persist(me..

JAVA 2021.11.09

[JAVA] JPA 애플리케이션 개발

JPA의 구동방식을 아래 이미지로 보고 시작하자! 1. EntityManagerFactory 데이터베이스당 하나만 생성하여 전체에서 공유하여 사용해야 한다. 여기에 들어가는 name은 persistence.xml의 unit name 이다. 2. EntityManager EntityManager는 다른 쓰레드들과 공유하면 안된다. ( Connection과 같다고 보면됨 / conn도 쓰고 close로 버리는것 처럼 얘도 close가 필수다! ) 모든 DB 접근은 Manager를 거쳐야한다. 3. EntityTransaction DB에 삽입, 수정 등 이용할 때 트랜잭션 받아와서 사용하는게 필수! JPA의 모든 데이터 변경은 트랙잭션 안에서 수행한다. ( 조회-select 는 예외 일 수 있음 ) 4. JP..

JAVA 2021.11.02