개체-관계 모델, 테이블간의 관계를 설명해주는 다이어그램
웹 ERD 작성: http://draw.io/
위 ERD 잠시 살펴보기
user와 user_history는 1:N 관계
-> user 한명에 매핑되는 user_history는 여러개
user와 review 또한 1:N
-> user 한명이 작성할 수 있는 review는 여러개
book과 review 1:N
-> book하나에 review는 없거나,1 또는 여러개
book과 author,publisher는 각각 M:N, N:1
-> book 한개의 여러 author, author 한명의 여러 book
-> 한개의 publisher에서 여러 book
실선(Identifying)
: 식별관계
부모테이블의 PK가 자식테이블의 FK/PK가 되는 경우
부모가 있어야 자식이 생기는 경우
점선(Non-Identifying)
: 비식별관계
부모테이블의 PK가 자식테이블의 일반속성이 되는 경우
부모가 없어도 자식이 생기는 경우
Type1(실선과 실선)
: 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)Type2(까마귀발)
: 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)Type3(실선과 까마귀발)
: 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)Type4(고리와 실선)
: 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)Type5(고리와 까마귀발)
: 0개 이상 (하나의 A는 0또는 하나 이상의 B로 구성되 있다.)Primitive type, Reference Type의 차이 : null을 허용할지 안할지
Primitive type
: Null이 존재하지 않음
→ boolean, byte, int, long, float, double 등
Reference Type
: Null이 존재
→ Integer, Array, Float, Class 등
create table book_review_info (
id bigint not null,
created_at timestamp,
updated_at timestamp,
average_review_score float not null,
book_id bigint,
review_count integer not null,
primary key (id)
)
연관 쿼리 오류 발생
Entity의 ID @GeneratedValue의 default는 Auto(H2:SEQUENCE) 저장할 때 문제가 발생
call next value for hibernate_sequence를 이용함으로, 테이블이 달라도 id가 증가하게 된다
book_review_info 테이블의 id 값이 7이 되어 오류 발생(데이터는 1개)
@Test
void crudTest2(){
Book book = new Book();
book.setName("JPA 책");
book.setAuthorId(1L);
book.setPublisherId(1L);
bookRepository.save(book);
System.out.println(">>> " + book);
BookReviewInfo bookReviewInfo = new BookReviewInfo();
bookReviewInfo.setBookId(1L);
bookReviewInfo.setAverageReviewScore(4.5f);
bookReviewInfo.setReviewCount(2);
bookReviewInfoRepository.save(bookReviewInfo);
System.out.println(">>> " + bookReviewInfoRepository.findAll());
//키 값을 통해 연관테이블 조회 (데이터베이스 기준)
Book result = bookRepository.findById(
bookReviewInfoRepository
.findById(1L)
.orElseThrow(RuntimeException::new)
.getBookId()
).orElseThrow(RuntimeException::new);
System.out.println(">>>" + result);
}
이를 해결하기 위해 Entity의 ID @GeneratedValue 전략을 IDENTITY로 수정
@GeneratedValue(strategy = GenerationType.IDENTITY)
IDENTITY로 변경하면 각 테이블에 ID에 자동증가
(id값을 공통으로 관리 X)
public class Book extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
...
}
//DDL -> default as identity
Hibernate:
create table book (
id bigint generated by default as identity,
created_at timestamp,
updated_at timestamp,
author_id bigint,
category varchar(255),
name varchar(255),
publisher_id bigint,
primary key (id)
)
//결과값: ID값이 1로 변경되어 테스트 성공
>>> Book(super=BaseEntity(createdAt=2021-07-25T08:57:27.172218200, updatedAt=2021-07-25T08:57:27.172218200), id=1, name=JPA 책, category=null, authorId=1, publisherId=1)