개발공부/[Spring]김영한_ORM표준 JPA프로그래밍 8

[다대일, N:1]양방향 연관관계 설정하기 _Order와 Member

Member는 Order(주문)을 여러개할 수 있다. 즉, Order의 입장으로는 N:1이므로 @ManyToOne 어노테이션을 사용하여 매핑한다. @JoinColumn을 통해 연결된 PK가 뭔지 알려준다. 다(N)쪽이 연관관계의 주인이 되므로 이 친구가 주인이다. // FK // Member의 Member_ID가 PK다. @ManyToOne @JoinColumn(name="MEMBER_ID") private Member member; 만약 양방향 관계로 하고싶다면 Member 엔티티에 Order의 리스트를 만들어 @OneToMany 를 붙여주고 속성에 mappedBy를 통해 member와 연결해주면 된다. 여기서 member는 위 코드의 private Member m..

영속성 컨텍스트, 엔티티의 생명주기

영속성 컨텍스트 > "엔티티를 영구 저장하는 환경" - J2SE 환경 기준 - EntityManager.persist(entity); DB에 저장한다는 의미가 아니라 entity를 영속성 컨텍스트에 저장한다는 의미 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있다. EntityManager와 영속성 컨텍스트가 1:1 관계이다. 엔티티의 생명주기 1. 비영속 상태 > 멤버 객체를 생성만한 상태 2. 영속 상태 > 객체 생성후 엔티티 매니저를 통해 persist해서 객체를 영속 컨텍스트에 넣는다. 3. 준영속 상태 > detach , 영속 상태의 엔티티가 영속성 컨텍스트에서 분리 4. 삭제 상태 > DB에서 객체를 삭제 영속성 컨텍스트의 이점 !! 1. 1차 캐시 key : pk value : enti..

[애플리케이션 개발]persistence_entityManagerFactory, 엔티티 생성

JPA에는 persistence가 있다. persistence는 persistence.xml에서의 정보를 가지고 EntityManagerFactory를 만든다. EntityManagerFactory는 EntityManager를 만든다. EntityManagerFactory 는 딱 하나만 만들어야한다. 일관적인 단위를 하나 할 때는 EntityManager 이용 (고객의 요청이 올 때마다) EntityManager 는 쓰레드간 공유 X , 사용하면 버려야함 JPA를 사용하면 내부에서 JDBC API를 사용해 SQL를 호출하여 DB와 통신한다. 아래 어노테이션을 사용해 엔티티를 생성한다. https://what-am-i.tistory.com/357?category=1083625 @Entity, @Table,..

[spring]JPQL이 뭔가요?(파라미터와 select)

JPQL(Java Persistence Query Language) > 객체 지향 SQL SQL을 추상화한 객체 지향 쿼리 언어이다. 그렇기 때문에 특정 DB SQL에 의존하지 않는다. SQL는 DB 테이블을 대상으로 쿼리를 날리지만 JPQL은 엔티티 객체를 대상으로 검색한다. JPQL은 결국 SQL으로 변환된다. List resultList = em.createQuery("select m from Member m where m.name like '%kim%'", Member.class) .getResultList(); 여기서 "select m from Member m ~~" 에서 Member는 테이블을 의미하는 것이 아니고 entity를 의미한다. Member.class는 createQuery가 반환할..

[spring] 양방향 연관관계&연관관계의 주인

객체는 참조로 연관된 객체를 찾고 테이블은 외래키로 조인을 통해 연관된 테이블을 찾는다. 양방향 연관관계 -> 팀과 멤버를 생각할 때 멤버를 보고 팀을 찾는 것과 팀을 보고 멤버를 찾는 두가지가 모두 되는 관계를 말한다. 객체 객체를 양방향으로 참조하려면 단방향 연관관계가 2개를 만들어야한다. 이것을 양방향 연관관계라고 이름 붙였다 팀 -> 멤버 멤버 -> 팀 테이블 테이블은 하나의 FK를 이용해 두 테이블이 연관관계를 관리한다. (양쪽으로 join가능) -> 연관관계가 1개 있다. 회원 팀 @OneToMany(mappedBy = "team") List members = new ArrayList(); 팀 입장에서 보면 Team이 1이고 Member가 N이므로 @OneToMany 어노테이션을 붙여준다. m..

[spring]단방향 연관관계

한 팀(TEAM)에 여러 Member가 있는 1:N관계를 가정하자. 그러면 TEAM의 ID가 FK로 Member 테이블에 들어있어야 한다. 이를 연관관계를 이용하면 좀 더 객체지향적으로 만들 수 있다. 테이블은 외래 키로 조인하여 연관된 테이블을 찾고 객체는 참조를 사용해 연관된 객체를 찾는다는 차이가 있다. @ManyToOne @JoinColumn(name="TEAM_ID") private Team team; Member에서 Team 자체를 갖고있다. (Team의 id를 갖고있는 것이 아니라) 위 코드처럼 작성하면 Member의 team과 TEAM_ID가 연관관계 매핑이 된다. @ManyToOne 과 같은 어노테이션을 통해 매핑을 하여 이 관계가 1:N인지 N:M인지 N:1인지 알려줘야한다. Membe..

[매핑 어노테이션]@Entity, @Table, @Enumerated, @Id, @GeneratedValue, @Temporal,@Lob

1. @Entity @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다. 꼭 기본 생성자가 있어야한다. ( 파라미터X) 2. @Table 엔티티와 매핑할 테이블을 지정하는 어노테이션이다. 속성으로 name = "" 으로 매핑할 테이블 이름을 변경할 수 있다. 3. @Enumerated enum을 설정하고 싶을 때 사용한다. (EnumType.STRING)으로 설정해주어야 안전하다. ORDINAL도 있는데 (default)이는 순서를 DB에 저장하는 것으로 안전하지않다. 예시 ) @Enumerated(EnumType.STRING) private OrderStatus status; 4. @Id 해당 변수를 pk로 설정해준다. 5. @GeneratedValue 따로 값을 넣지 않아도 자동적으로 숫자가 ..

플러쉬(flush)란?

1. 플러쉬란 ? 플러쉬 : 영속성 컨텍스트의 변경 내용을 DB에 동기화 쓰기 지연 SQL 저장소에 있는 것들이 DB에 반영되는 것이다! 2. 플러쉬가 발생하면 ? 1. 변경감지 2. 수정된 엔티티 쓰기 지연 SQL 저장소에 등록 3. 쓰기지연 SQL 저장소의 쿼리를 DB에 전송 3. Flush는 언제 발생하나요? 1. em.flush() 2. JPQL을 실행할 경우 3. 트랜잭션 커밋