본문 바로가기

Java/JPA

(21)
상속관계 테이블 설계 전략 조인 전략을 기본으로 확장할 일도 없을거같고 데이터도 넘 단순하다 -> 싱글 테이블 전략 근데, 비즈니스적으로 중요하고 복잡하다 -> 조인 테이블 전략@Inheritance(strategy=InheritanceType.JOINED : 조인전략SINGLE_TABLE : 단일 테이블 전략@DiscriminatorColumn(name="DTYPE") : 싱글테이블 사용 시 필수. DTYPE을 만들어주는 어노테이션. 어떤 구체적인 서브타입인지(ex.Book,Movie...) 알려준다.@DiscriminatorValue("XXX") : 따로 지정하지 않으면 기본으로 엔티티 이름을 사용한단일 테이블 전략 단점 : 자식 엔티티가 매핑한 컬럼은 모두 null 허용
연관관계 매핑(양방향) 가급적이면 단방향으로 설계하시오!단방향 매핑만으로도 이미 객체랑 테이블 연관관계 매핑은 완료.단방향 매핑을 잘하고 양방향은 필요할 때 추가해라.(양방향 매핑은 반대방향으로 조회 기능(객체 그래프 탐색)이 추가된 것 뿐임) 실무에서는 JPQL에서 역방향으로 탐색할 일이 많음. 필요할 때 추가하면 됨. (테이블에 영향 없음) @Entity @Getter @Setterpublic class Team { @Id @GeneratedValue @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany(mappedBy = "team") // Member의 Team타입의 변수명 private List member..
연관관계 매핑(단방향) Member(n) : team(1) 매핑 @Entity @Getter @Setter 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;*/ @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; } @JoinColumn의 name 값으로 select 쿼리 나갈때 join해서 나감. left outer join Team team1_ on member0_.TEAM_ID=team..
JPA 매커니즘 EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유한다.EntityManager는 쓰레드간 공유하지 x(사용하고 버린다)JPA의 모든 데이터 변경은 트랜잭션 안에서 실행한다.준영속상태(detach) : 영속성 컨텍스트에서 빠진 상태em.clear() : 1차캐시 다 지움. 테스트할 때 많이 쓰인다. 영속성 컨텍스트(엔티티를 영구 저장하는 환경)의 이점1차 캐시 동일성(identity) 보장트랜잭션을 지원하는 쓰기 지연변경 감지(Dirty Checking)지연 로딩(Lazy Loading)같은 트랜잭션 내에서는 동일성 보장한다.@Testpublic void testMember() throws Exception { // given Member member = new ..
JPA 도메인분석설계 @Entity 가급적이면 개발자가 클래스로 바로 볼 수 있도록, Column 길이나 index를 다 적어주면 좋겠다. 스프링부트에서는 엔티티의 필드 이름이 orderDate이면 -> order_date 로 관례대로 바꿔줌 @Entity 저장할 필드에 final 사용x 데이터베이스 스키마 자동생성하기 -(운영에서는 절대 create,create-drop,update 사용하면 안됨!) -테스트서버에서 validate는 괜찮다. (create하면 처음에 drop하고 create하니까 난리남, update도 alter나가서 rock걸림!!! 그럼 장애남....) - 개발 초기 단계에서는 create또는 update 괜찮음...그래도 가급적이면 쿼리 직접 쓰는걸 권장. 직접 쿼리 짜는거 귀찮으니까 create 문 꼼꼼히 따져보..