하나의 유저가 여러개의 물품을 가지고 있는것을 DB에 저장하려고 합니다.
이를 위해서는 다대일 구조로 만들어보는것을 생각했습니다.
일단 Product 테이블을 만들어봅니다.
create table product(
productid int not null auto_increment comment 'PK',
memberid int not null comment '회원id',
product_name varchar(50) not null comment '물품 이름',
auction_price int default 0 comment '경매가격',
product_price int not null comment '즉시거래가격',
image_namesrc varchar(100) comment '이미지',
product_explanation varchar(1000) default '설명이 없습니다.' comment '물품상세설명',
product_category varchar(20) not null comment '물품카테고리',
created_date timeStamp not null comment'생성일자',
primary key(productid),
foreign key(memberid) references member_table (memberid) on update cascade on delete cascade
);
경매가격을 처리 안할수도, 설명과 이미지는 물건을 판매할 때 넣지 않아도 된다고 생각해서 뺐습니다.
이제 만들어둔 Member_table과 Product 테이블을 Jpa로 설정해서 활용해보겠습니다.
JPA에서는 JDBC(Mybatis)를 사용했을 때와 달리 연관 관계에 있는 상대 테이블의 PK를 멤버 변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조합니다.
예를들어 Category 엔티티와 Book 엔티티의 관계에서 Book 엔티티가 Category 엔티티를 참조할 때 Mybatis와 JPA는 아래와 같이 다릅니다.
// Mybatis
private Integer categoryNo;
// JPA
private Category category
Mybatis는 관계에 있는 테이블의 PK를 멤버 변수로 갖지만, JPA는 관계에 있는 엔티티 객체를 참조하고 있습니다.
@ManyToOne
@ManyToOne 어노테이션은 이름 그대로 다대일( N : 1 ) 관계 매핑 정보입니다.
물건 입장에서는 유저와 다대일 관계이므로 @ManyToOne이 됩니다.
연관관계를 매핑할 때 이렇게 다중성을 나타내는 어노테이션(@ManyToMany, @OneToOne 등…)은 필수로 사용해야 하며, 엔티티 자신을 기준으로 다중성을 생각해야 합니다.
@JoinColumn
@JoinColumn 어노테이션은 외래 키를 매핑 할 때 사용합니다.
name 속성에는 매핑 할 외래 키 이름을 지정합니다.
Book 엔티티의 경우 Category 엔티티의 no 필드를 외래 키로 가지므로, category_no를 작성하면 됩니다.
@JoinColumn 어노테이션을 생략하면 아래와 같은 전략에 따라 외래 키를 매핑합니다.
필드명 + “_” + 참조하는 테이블의 기본 키(@Id) 컬럼명
product 클래스에서 member_table을 가져올 것입니다. 서로 저장될 때 member_table의 객체를 가져올 것입니다.
member가 저장되고 그 다음 product가 저장될 때 Member_table을 setter로 저장하는 것을 볼 수 있습니다.
근데 객체 그대로 저장하는데 jpa에서 알아서 member_table의 memberid를 product의 memberid로 외래키 저장을 하는 것 같습니다.
Hibernate에서 만드는 insert 문입니다.
product 테이블에서 memberid가 86이 제대로 들어왔음을 알 수 있습니다.
'JAVA > - Spring' 카테고리의 다른 글
[spring boot] SLF4J: Failed toString() invocation on an object of type 오류해결 (0) | 2022.04.22 |
---|---|
[spring boot] thyemleaf와 서버간의 object 주고 받기 (0) | 2022.04.21 |
[Spring boot] thymeleaf로 로그인 만들어 보기 (0) | 2022.04.17 |
Spring boot, thymeleaf 연동시 js, css, 파일경로 인식하지 못할 때 (2) | 2022.04.15 |
react router props 전달 & 브라우저에 쿠키 저장 해보기 (0) | 2022.04.09 |