• Home
  • About Me
    • Yoon's Blog photo

      Yoon's Blog

      융가의
      개발일지입니다 :)

    • Learn More
    • Email
    • Facebook
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
    • JAVA
      • Java
      • spring Boot
    • PHP
      • PHP 7
      • Codeigniter
      • Lalavel
    • Linux
      • Linux
      • Ubuntu
    • DataBase
      • Oracle
      • Mysql
    • Develope Enviroment
      • Eclipse
      • Docker
      • Git hub

[Spring Boot] Jpa Mapping 연관관계 1

24 Aug 2021

Reading time ~2 minutes

연관관계 (단방향과 양방향)

연관관계 매핑

  • 방향 : 단방향, 양방향
  • 다중성 : 일대일, 일대다, 다대일, 다대다
  • 연관관계 주인 : 객체 양방향 연관관계는 주인이 필요함!

1. 일대일 단방향

1. Entity

1. Host - 주 테이블

package com.example.demo.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
@Data
public class Host1 {

	// 1:1 단방향
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String name;

	@OneToOne
	@JoinColumn(name = "target_id")
	private Target1 target;

	@Builder
	public Host1(String name, Target1 target) {
		this.name = name;
		this.target = target;
	}

} 

2. Target

package com.example.demo.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@NoArgsConstructor
@Data
public class Target1 {

	// 1:1 단방향
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	private String name;

	@Builder
	public Target1(String name) {
		this.name = name;
	}
}  

3. Host1Repository

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.demo.domain.Host1;

@Repository
public interface Host1Repository extends JpaRepository<Host1, Long> {

}

4. TargetRepository

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.demo.domain.Target1;

@Repository
public interface Target1Repository extends JpaRepository<Target1, Long> {

}

5. HostTargetService

package com.example.demo.service;

import org.springframework.stereotype.Service;

import com.example.demo.domain.Host1;
import com.example.demo.domain.Target1;
import com.example.demo.repository.Host1Repository;
import com.example.demo.repository.Target1Repository;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class HostTargetService1 {

	private final Target1Repository targetRepo;
	private final Host1Repository hostRepo;

	public void save() {
		Target1 target = Target1.builder().name("target1").build();
		Host1 host = Host1.builder().name("host1").target(target).build();

		targetRepo.save(target);
		hostRepo.save(host);
	}

	public Target1 read1() {
		return targetRepo.findById(1L).get();
	}

	public Host1 read2() {
		return hostRepo.findById(1L).get();
	}
}

6. HostTargetController

package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.domain.Host1;
import com.example.demo.domain.Host2;
import com.example.demo.domain.Target1;
import com.example.demo.domain.Target2;
import com.example.demo.service.HostTargetService1;
import com.example.demo.service.HostTargetService2;

import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;

@Api
@RestController
@RequestMapping("/host-target")
@RequiredArgsConstructor
public class HostTargetController {
	private final HostTargetService1 hostTargetService1;
	private final HostTargetService2 hostTargetService2;

	@PostMapping("/save1")
	public void save1() {
		hostTargetService1.save();
	}

	@GetMapping("/read-host1")
	public Host1 readparent1() {
		return hostTargetService1.read2();
	}

	@GetMapping("/read-target1")
	public Target1 readchild1() {
		return hostTargetService1.read1();
	}
}

7. Swagger & DB 확인하기

1. save1 실행

save1 실행하면 test 계정에 host1 과 target1 테이블이 만들어지며, 데이터 insert를 확인할 수 있다.

Eclipse 콘솔창 log에 찍힌 Insert query도 확인해보자.

2. DBeaver 확인하기 (Data Insert 와 ERD)

1) host1 과 target1 테이블 & 데이터 확인
2) ERD 확인
target1 테이블의 PK인 id가 host1 테이블의 FK로 설정된것 확인.

3. read-host1 조회

log에 찍힌 Select query 확인하면 아래와 같다.

Join된 query 확인이 가능하다.

4. read-target1 조회



SpringBootJavaREST APIJPAHibernateSwaggerEclipse Share Tweet +1