BackEnd : Spring/SpringBoot

[Springboot] 연관관계 매핑 : 일대일

snoony 2024. 5. 27. 17:39

연관관계 매핑 종류

  • One To One : 일대일
  • One To Many : 일대다
  • Many To One : 다대일
  • Many To Many : 다대다

연관관계 매핑 방향

  • 단방향 : 두 엔티티의 관계에서 한쪽의 엔티티만 참조하는 형식
  • 양방향 : 두 엔티티의 관계에서 각 엔티티가 서로의 엔티티를 참조하는 형식

일대일 매핑

1. 일대일 단방향 매핑

BaseEntity

@Getter
@Setter
@ToString
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime updatedAt;
}

 ProductDetail

@Entity
@Getter
@Setter
@ToString
public class ProductDetail extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String description;

    @OneToOne
    @JoinColumn(name = "product_number")
    private Product product;
}

Product

@Entity
@Getter
@Setter
@ToString
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long number;
    private String name;
    private Integer price;
    private Integer stock;
}

Test

@SpringBootTest
@RequiredArgsConstructor
public class ProductDetailRepositoryTest {
    private final ProductDetailRepository productDetailRepository;

    private final ProjectRepository projectRepository;

    @Test
    public void saveAndReadTest1(){
        Product product = new Product();
        product.setName("사과");
        product.setPrice(1000);
        product.setStock(50);
        projectRepository.save(product);

        ProductDetail productDetail = new ProductDetail();
        productDetail.setDescription("맛좋은 사과");
        productDetail.setProduct(product);
        productDetailRepository.save(productDetail);

        Optional<ProductDetail> savedDetail = productDetailRepository.findById(productDetail.getId());
        if(savedDetail.isPresent()){
            ProductDetail p = savedDetail.get();
            System.out.println(p);
        }
    }
}

2. 일대일 양방향 매핑

Product

@Entity
@Getter
@Setter
@ToString
@Table(name = "product")
public class Product extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long number;
    @Column(nullable = false)
    private String name;
    @Column(nullable = false)
    private Integer price;
    @Column(nullable = false)
    private Integer stock;

    @OneToOne(mappedBy = "product")
    private ProductDetail productDetail;
}