JPA

· JPA
JPA는 다음과 같은 상속관계에서 세 가지의 상속관계 매핑을 지원한다. InheritanceType.JOINED: 조인 전략 InheritanceType.SINGLE_TABLE: 단일 테이블 전략
· JPA
흔한 경우는 아니겠지만 가끔 필요할 때가 있다. 예를 들어 카테고리는 다른 카테고리를 가리키면서 계층을 형성한다. 그런데 계층마다 이름만 다른 똑같이 생긴 카테고리 클래스를 생성해서 관계를 맺는 것은 비효율적이다. 이런 경우 같은 카테고리 클래스끼리 다대일 양방향 관계를 맺는 것이 편리하다. 아래는 카테고리 클래스로 다대일 양방향 관계를 맺은 모습이다. @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; String..
· JPA
주 테이블에 외래키 주체 Entity(멤버)가 직접 FK를 관리하는 상태. 특징은 다음과 같다. 객체 지향 개발자가 선호한다. JPA 매핑이 편리하다. 주 테이블만 조회해도 연관 테이블의 데이터를 함께 확인할 수 있다. 단점으로는 외래키 값이 없으면 null을 허용한다. optional 설정으로 극복 가능(?) 일단 null을 허용하는 것이 DBA 입장에서 바라보았을 때 꽤나 치명적일 것이라고 영한님께서 말씀해주셨다. 그러면 애플리케이션 단에서 @NotNull 같은 Validation으로 null을 예방하면 되지 않을까? 라고 생각이 들었다.하지만 그렇다고 해서 DB 컬럼에 NOT NULL 제약이 생기는 것은 아니므로 여전히 잠재적인 위험이 있다고 보는 것 같다. 그리고 외래키에 UNIQUE 속성이 적용..
· JPA
JPA의 표준 스펙에서는 fetch join 대상에 별칭을 줄 수 없다. 그런데 하이버네이트는 허용한다. 즉 fetch join 대상에 별칭을 사용할 수는 있으나 주의할 점이 있다. 주의할 점이라는 것은 조인하는 대상을 필터링하는 행위이다. 설정한 Entity의 관계 Parent(1) : Child(N) @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mapp..
· JPA
여러 기술블로그 글을 통해서 페이징을 할 때에는 OOM을 방지하기 위해 fetch join을 삼가해야 한다는 것을 알고 있었다. 왜냐하면 JPA가 distinct를 고려하여 페이징 조건을 맞추기 위해 모든 데이터를 메모리에 불러오기 때문이다. 이는 OOM을 발생시킬 수 있기 때문에 굉장히 위험하며 @OneToMany 또는 @ManyToMany 관계에서 해당되는 이야기이다. 왜 @OneToMany 또는 @ManyToMany에서만 해당되는 이야기일까? OneToMany를 예로 들자면 1의 입장에서 fetch join을 수행할 때 1에 해당하는 데이터가 N개 만큼 쪼개지는 현상이 발생한다. 말로 설명하기 어려운데 다음 그림을 참고하면 좋을 것 같다. 위 그림처럼 쿼리의 결과로 group1이 두 번 나타나는 현..
· JPA
0. N:1 환경설정 @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Parent { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; } @Entity @Getter @Builder @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Child { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Ma..
@xftg77g
'JPA' 카테고리의 글 목록