일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- BOJ
- fetch
- eager
- 힙
- FetchType
- 데코레이터
- shared lock
- PS
- 즉시로딩
- JPQL
- 유니크제약조건
- 다대다
- querydsl
- execute
- 연결리스트
- 스프링 폼
- 일대다
- 동적sql
- 지연로딩
- dfs
- SQL프로그래밍
- CHECK OPTION
- 다대일
- 낙관적락
- 백트래킹
- exclusive lock
- 스토어드 프로시저
- 비관적락
- 이진탐색
- 연관관계
- Today
- Total
목록All (557)
흰 스타렉스에서 내가 내리지
부모, 자식, 손자까지 계속 기본 키를 전달하는 식별 관계다. 식별 관계에서 자식 테이블은 부모 테이블의 기본 키를 포함해서 복합 키를 구성해야 하므로 @IdClass 나 @EmbeddedId를 사용해서 식별자를 매핑해야 한다. @IdClass와 식별관계 @Entity @Getter @Setter public class Parent { @Id @Column(name = "PARENT_ID") private Long id; private String name; } @Entity @Getter @Setter @IdClass(ChildId.class) public class Child { @Id @ManyToOne @JoinColumn(name = "PARENT_ID") public Parent parent;..
@Entity public class Hello{ @Id private String id1; @Id private String id2; } 둘 이상의 컬럼으로 구성된 복합 기본 키는 위의 코드처럼 하면 매핑 오류가 발생한다. JPA에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다. JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 그리고 식별자를 구분하기 위해 equals와 hashCode를 사용해서 동등성 비교를 한다. 그런데 식별자 필드가 하나일 때는 보통 자바의 기본 타입을 사용하므로 문제가 없지만, 식별자 필드가 2개 이상이면 별도의 식별자 클래스를 만들고 그곳에 equals와 hashCode를 구현해야 한다. JPA는 복합 키를 지원하기 위해 ..
데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분한다. 식별관계 (Identifying Relationship) 비식별관계 (Non-Identifying Relationship) 식별관계 : 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계 비식별관계 : 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계 비식별 관계 - 필수적 비식별 관계 : 연관관계를 필수로 맺어야 한다. 외래 키에 null을 허용하지 않는다. - 선택적 비식별 관계 : 연관관계를 맺을지 말지 선택할 수 있다. 외래 키에 null을 허용한다. 최근에는 비식별 관계를 주로 사용하고 꼭 필요한 곳에만 식별 관계를 사용하..
슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법이 있다. 1. 조인 전략 - 위의 사진처럼 각각을 모두 테이블로 만들고 조회할 때 조인 사용 2. 단일 테이블 전략 - 테이블을 하나만 사용해서 통합 3. 구현 클래스마다 테이블 전략 - 서브타입마다 하나의 테이블을 만듦. 비추천 1. 조인 전략 맨 위 사진처럼 엔티티 각각을 모두 테이블로 만들고, 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 따라서 조회할 때 조인을 자주 사용한다. 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없다. 따라서 타입을 구분하는 DTYPE 컬럼을 구분 컬럼으로 사용한다. @Entity @Inheritance(strategy = Inheri..
@ManyToMany 이용 @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToMany @JoinTable(name = "MEMBER_PRODUCT", joinColumns = @JoinColumn(name = "MEMBER_ID"), inverseJoinColumns = @JoinColumn(name = "PRODUCT_ID")) private List products = new ArrayList(); } @Entity public class Product { @Id @GeneratedValue @Col..
다대일, 일대다, N:1, 1:N, ManyToOne, OneToMany - 양방향 @Entity @Getter @Setter public class Member{ @Id @GeneratedValue @Column(name = "MEMBER_ID") private Long id; private String username; @ManyToOne @JoinColumn(name = "TEAM_ID") private Team team; public void setTeam(Team team){ this.team = team; //무한루프에 빠지지 않도록 체크 if(!team.getMembers().contains(this)){ team.getMembers().add(this); } } } @Entity @Gett..
객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 애플리케이션 로직으로 잘 묶어서 양방향인 것처럼 보이게 할 뿐이다. JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래 키를 관리해야 하는데 이것을 연관관계의 주인 이라 한다. 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리 (등록, 수정, 삭제) 할 수 있다. 반면에 주인이 아닌 쪽은 읽기만 할 수 있다. 주인은 mappedBy 속성을 사용하지 않는다. 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다. mappedBy 속성은 양방향 매핑일 때 사용하는 데 반대쪽 매핑의 필드 이름을 값으로 주면 된다. 연관관계의 주인을 정한다는 것은 사실 외래 키 관리자를..
@Transient private String firstName; @Transient private String lastName; private String fullName; @Access(AccessType.PROPERTY) public String getFullName(){ return firstName + lastName; } 프로퍼티 접근 방식으로 지정.
이 필드는 매핑하지 않는다. 따라서 데이터베이스에 저장하지 않고 조회하지도 않는다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다. @Transient private Integer temp;
@Temporal 날짜 타입 (java.util.Date, java.util.Calendar) 을 매핑할 때 사용한다. 속성 기능 기본값 value TemporalType.DATE 날짜, 데이터베이스 date 타입과 매핑 (예 : 2023-02-10) TemporalType.TIME 시간, 데이터베이스 time 타입과 매핑 (예 : 15:25:25) TemporalType.TIMESTAMP 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (예 : 2023-02-10 15:25:25) @Temporal(TemporalType.DATE) private Date date; @Temporal(TemporalType.TIME) private Date time; @Temporal(TemporalType.T..