public class ProductDetail extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String description;
@OneToOne
@JoinColumn(name ="product_number")
private Product product;
}
@SpringBootTest
public class ProductDetailRepositoryTest {
@Autowired
ProductDetailRepository productDetailRepository;
@Autowired
ProductRepository productRepository;
@Test
public void saveAndReadTest(){
/** 객체 생성 */
Product product = new Product();
product.setName("스프링 부트 JPA");
product.setPrice(5000);
product.setStock(500);
ProductDetail productDetail = new ProductDetail();
productDetail.setProduct(product);
productDetail.setDescription("스프링 부트와 JPA를 함께 볼 수 있는 책");
/** 저장 */
productRepository.save(product);
productDetailRepository.save(productDetail);
/** 확인 */
System.out.println("savedProduct : " +
productDetailRepository
.findById(productDetail.getId())
.get()
.getProduct());
System.out.println("savedProductDetail : " +
productDetailRepository
.findById(productDetail.getId())
.get());
}
}
select 절에서 product_detail과 product과 함께 조회된다.
left outer join 실행 이유 : optional 값이 true로 설정 되어 있기 때문에 매핑 값이 null인 결과도 포함하는 Left Outer Join이 실행된다.
false로 설정 시 Inner Join 실행
fetch() : DB 로딩 전략 (default : EAGER 즉시 로딩)
optional() : 매핑 시 매핑 값 null 유무
default : true 매핑 값이 null이어도 된다.