스프링 부트 @Entity 관계설정 생성하기
- pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
- application.properties 파일의 내용을 수정한다.
spring.datasource.url=jdbc:mysql://localhost:3306/connectdb?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=connect
spring.datasource.password=connect
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.initialization-mode: always
spring.jpa.hibernate.ddl-auto= create-drop
spring.jpa.show-sql= true
spring.jpa.properties.hibernate.format_sql= true
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
spring.datasource.initialization-mode: always
위의 설정은 data.sql 을 자동실행 한다.
spring.jpa.hibernate.ddl-auto= create-drop 테이블이 자동생성, 삭제
spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect Hibernate 가 MySQL을 위한 SQL 생성하도록 한다.
- data.sql (sample 데이터)
insert into roles (id, name) values (1, 'USER');
insert into roles (id, name) values (2, 'ADMIN');
insert into account (id, create_date, email, name, nick_name, passwd)
values(1, now(), 'urstory@gmail.com', 'kim', 'toto', '1234');
insert into account (id, create_date, email, name, nick_name, passwd)
values(2, now(), 'carami@gmail.com', 'kang', 'carami', '1234');
insert into account_roles(account_id, role_id) values( 1, 1);
insert into account_roles(account_id, role_id) values( 2, 1);
insert into account_roles(account_id, role_id) values( 1, 2);
- domain 패키지에 Entity 클래스를 만들었다.
-
관계에 대하여 그림으로 그린다.
-
클래스를 작성
-
필드를 선언
-
관계 필드를 선언
-
생성자를 작성 (날짜, 컬렉션 프레임워크 관련된 필드를 초기화)
-
@Entity, @Table, @Setter, @Getter 추가
-
식별자 관련된 필드 선언
- @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) // 자동증가. - private Long id;
-
-
@Column @OneToOne @OneToMany @ManyToOne @ManyToMany 를 알맞게 설정
-
애플리케이션을 실행하면, 원하는대로 테이블이 생성되었는지 확인한다.
- 엔티티를 이용하여 CRUD작업을 하려면 Repository를 만든다.
JpaRepository<엔티티클래스명, Id타입명> 을 상속받도록 한다.
Spring은 위의 Repository를 구현하는 빈을 자동생성한다.
import my.examples.blog.domain.Role;
import org.springframework.data.jpa.repository.JpaRepository;
public interface RoleRepository extends JpaRepository<Role, Long> {
}
- Repository를 사용하는 Service객체를 만든다.
import my.examples.blog.domain.Role;
import my.examples.blog.repository.RoleRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class RoleService {
@Autowired
RoleRepository roleRepository;
@Transactional
public void addRole(Role role) {
Role result = roleRepository.save(role);
System.out.println(result.getId() + ", " + result.getName());
}
}
- ervice를 사용하는 Controller를 만든다.
import my.examples.blog.domain.Role;
import my.examples.blog.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class RoleController {
@Autowired
RoleService roleService;
@GetMapping("/roleform")
public String roleform(){
return "roleform";
}
@PostMapping("/rolesave")
public String rolesave(@RequestParam(name = "name")String name){
Role role = new Role();
role.setName(name);
roleService.addRole(role);
return "redirect:/roleform";
}
}
객체와 테이블의 맵핑
- FK 위치
@JoinColumn(name =“~~~”)
- Fk 설정
*1:1 의 관계는 fk 아무곳에나 둬도 ok
@OneToOne
- 원하는곳에 @JoinColumn
*보통 1: 는 *쪽에 위치
@OneToMany(mappedBy = “”)
@ManyToOne
- 여기에 @JoinColumn.
**테이블과 테이블은 다대다 관계(:*) 가 없다.
그래서 다대다 관계를 해주려면 관계테이블이 그 사이에 존재해야한다.
EX) a,b가 다대다라면?
a. ————* c *————— b
c
a_id
b_id
@ManyToMany
@JoinTable(name = “~~”)
- mappedBy
테이블은 외래키 하나로 두 테이블의 연관관계를 관리하는데 엔티티를 단방향으로 매핑하면 참조를 하나만 사용하고, 양방향 관계로 설정하면 객체의 참조는 양쪽에서 하나씩 둘인데, 외래 키는 하나이므로 두 엔티티 중 하나(OWNER)를 정해서 테이블의 외래키를 관리해야 하고 MANY쪽이 OWNER 이며 mappedBy는 @OneToMany쪽의 컬렉션 칼럼에 기술하여 OWNER가 아님을 정의한다.
mappdBy는 @OneToOne, @OneToMany, @ManyToMany 어노테이션에서 사용할 수 있으며 mappedBy가 없으면 JAP에서 양뱡향 관계라는 것을 모르고 두 엔티티의 매핑 테이블을 생성한다.
mappedBy는 OWBER 엔티티의 필드나 속성과 대응된다.
ManyToOne 양방향 관계에서 Many측에는 mappedBy요소를 사용할 수 없다.(MANY 쪽이 OWNER)
OneToOne 양방향 관계에서 OWNER는 반대쪽(INVERSE SIDE)에 대한 FK를 가지는 쪽이다.
ManyToMany 양방향 관계는 양쪽 중 아무나 OWNER가 될 수 있다.