일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 집합 연산
- 자바스크립트innerText
- 오라클
- 고립성
- 자바스크립트경고창
- SQL문의 실행 순서
- 다중값 속성
- 트랜잭션의 특성
- java
- 관계 연산
- 속성의 종류
- 연속성
- SQL 종류
- Oracle
- 자바JVM
- 결합 연산
- 설계 속성
- alert경고창
- JAVA JVM
- 속성의 특징
- 기본 속성
- 발생시점에 따른 엔터티의 종류
- 복합 속성
- 테이블의 구조
- 단일 속성
- 제이쿼리text
- sql
- 유형과 무형에 따른 엔터티 종류
- css 선택자
- 파생 속성
Archives
- Today
- Total
wms's Programming&Study
JPA 엔티티 복합키 설정하기 본문
이슈사항
배치로 통계를 구축해야하는데 mybatis 같은 경우에는 DB에서 pk를 여러개 만들어주면 되지만
JPA에서는 엔티티에서도 id를 지정해줘야하기 때문에
엔티티에 복합키를 설정하는 방법을 찾아보았다.
해결방안
엔티티에 복합키를 설정하는 방법으로 2가지를 찾았다.
1. @Embeddable
2. @IdClass
그리고 각각 조건이 있는데 아래 사항을 만족해야한다.
@Embeddable
- 식별자 클래스에 @Embeddable어노테이션 추가
- 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)
- 식별자 클래스의 접근 지정자는 public
- Serializable을 상속
- 컬럼명과 변수명이 다를 경우 @Column어노테이션 사용
@IdClass
- 식별자 클래스의 변수명과 엔티티에서 사용되는 변수명이 동일
- 디폴트 생성자가 존재 (위의 코드는 Lombok의 @NoArgsConstructor어노테이션 추가로 자동 생성)
- 식별자 클래스의 접근 지정자는 public
- Serializable을 상속
해결
@Embeddable 같은 경우에는 나중에 엔티티에서 통계를 꺼내 올 때
ID를 지정해둔 클래스에 한번 더 접근해서 가져와야하기 때문에 코드가 좀 더 길어지게 된다.
그래서 좀 더 보기 쉬운 @IdClass 로 선택하였다.
엔티티 부분 코드
@Entity
@Table(name = "statistics")
@IdClass(StatisticsId.class)
public class Statistics {
@Id
@Column(name = "statistics_date")
private LocalDate statisticsDate;
@Id
@Column(name = "statistics_id")
private Long statisticsId;
@Column(name = "statistics_type", nullable = false)
@Enumerated(EnumType.STRING)
private String statisticsType;
}
복합키 클래스 코드
public class StatisticsId implements Serializable {
@Column(name = "statistics_date")
private LocalDate statisticsDate;
@Column(name = "statistics_id")
private Long statisticsId;
}
Repository 부분 코드
JpaRepository의 제네릭 타입에는 엔티티 클래스와 엔티티 클래스의 기본키 클래스를 넣어주면 된다.
public interface StatisticsRepository extends JpaRepository<Statistics, StatisticsId> {
}
참고 사이트
'Programming > JAVA' 카테고리의 다른 글
JPA Querydsl from절에 subquery 사용하기(@Subselect 이용) (1) | 2023.01.14 |
---|---|
나라별 시간대가 필요할 때 LocalDateTime to ZonedDateTime (0) | 2023.01.01 |
프로젝트 어플리케이션 전체 서버 시간 UTC-> KOR로 설정하기 (2) | 2022.12.24 |
동기화, 비동기화, 컨커런트 컬랙션 (0) | 2021.10.16 |
인터페이스와 추상클래스 (0) | 2021.10.10 |