인프런 커뮤니티 질문&답변

도던님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

양방향 매핑 질문 드립니다.

작성

·

231

0

class Item(
id: Long,
orderId: String,
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = id

var orderId: String = orderId


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "shipping_id")
var shipping: Shipping? = null

}

@Entity
class Shipping(
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long = id

@Embedded
var trackingInformation: TrackingInformation? = null


@OneToMany(mappedBy = "shipping", cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
var items: MutableList<Item> = mutableListOf()


fun updateTrackingInformation(trackingInformation: TrackingInformation) {
this.trackingInformation = trackingInformation
}

}
// 위처럼 양방향 연관관계를 맺었는데
// 이것도 되고
class Facade(
private val shippingService: ShippingService,
private val itemService: ItemService,
) {

fun getResult(pipeline: String) {

val shipping = shippingService.getShippings(listOf("0000000003")).first()
shipping.items.first().setOrderId("test")

shippingService.save(shipping)
}
}

// 이것도 됩니다.
class Facade(
private val shippingService: ShippingService,
private val itemService: ItemService,
) {

fun getResult(pipeline: String) {
val item = itemService.getItemByKitSlug(result.kitSlug)
item.shipping.updateTrackingInformation(trackingInformation)

itemService.save(item)

}
}

mappedBy로 된 shipping.items 필드로 접근하면 insert, update가 안될 거라고 생각했는데
둘다 변경이 되어서 질문드립니다.

제가 어떤 점을 놓치고 있는 걸까요?

답변 2

1

도던님의 프로필 이미지
도던
질문자

2021. 04. 01. 22:18

감사합니다 :)

0

김영한님의 프로필 이미지
김영한
지식공유자

2021. 04. 01. 21:50

안녕하세요. 도던님

mappedBy는 연관관계에만 영향을 줍니다. 그러니까 FK 값에만 영향을 주는 것이지요.

shipping.items.first().setOrderId("test")

제가 코틀린을 사용하지 않아서 아마 이 코드가 shipping.items의 첫번째 item을 조회해서 orderId를 변경하는 코드 같아요. 그렇다면 Item 객체가 변경된 것이기 때문에 변경감지(Dirty checking)이 발생합니다. 이것은 mappedBy와 무관하게 모든 엔티티에서 발생합니다.

두번째도 변경감지(Dirty checking)이 발생해서 변경된 코드 입니다.

감사합니다.

도던님의 프로필 이미지

작성한 질문수

질문하기