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;
}