database by narae :p

JPA @OneToMany - targetEntity ๋ณธ๋ฌธ

๊ฐœ๋ฐœ ๋…ธํŠธ

JPA @OneToMany - targetEntity

dbbymoon 2023. 3. 9. 03:43

Objective

๐Ÿ’ก JPA์˜ @OneToMany ์—ฐ๊ด€ ๊ด€๊ณ„์—์„œ ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ๊ฐ€ open class ์ธ ๊ฒฝ์šฐ read-only ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  Mutable ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š”๋ฐ, ์›์ธ๊ณผ read-only ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

 

Background

build.gradle.kts

allOpen {
	annotation("javax.persistence.Entity")
	annotation("javax.persistence.MappedSuperclass")
	annotation("javax.persistence.Embeddable")
}

OrderEntity.kt

OrderProductEntity.kt

Error Message

  • One To Many ์†์„ฑ ๊ฐ’์˜ ๋ฐ์ดํ„ฐ๋Š” ‘? extends OrderProductEntity’ ๊ฐ€ ๋  ์ˆ˜ ์—†๋‹ค.
Collection has neither generic type or OneToMany.targetEntity() defined: 
moonee.order.storage.db.core.entity.OrderEntity.orderProductList
  • ์ปฌ๋ ‰์…˜์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ฑฐ๋‚˜, OneToMany์˜ targetEntity๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

์›์ธ

public interface List<out E> : Collection<E>
  • List๋Š” ๊ณต๋ณ€์„ฑ์„ ๊ฐ€์ง„๋‹ค.
    • ๊ณต๋ณ€์ ์ด๋‹ค ?
      • ํ•˜์œ„ ํƒ€์ž… ๊ด€๊ณ„๊ฐ€ ์œ ์ง€๋œ๋‹ค.
      • A๊ฐ€ B์˜ ํ•˜์œ„ ํƒ€์ž…์ผ ๋•Œ, List<A>๊ฐ€ List<B>์˜ ํ•˜์œ„ํƒ€์ž…์ด๋‹ค.
      • A๊ฐ€ B์˜ ํ•˜์œ„ ํƒ€์ž…์ผ ๋•Œ, List<A> ํƒ€์ž…์˜ ๊ฐ’์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์— List<B> ํƒ€์ž…์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ฝ”ํ‹€๋ฆฐ์˜ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ final์ด๋‚˜, allOpen ์„ค์ •์„ ํ†ตํ•ด @Entity ํด๋ž˜์Šค๋Š” ์ƒ์† ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค์ด๋‹ค.
      • orderProductList์˜ ํƒ€์ž…์„ List<OrderProductEntity> ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด, List<OrderProductEntity> ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ ์ˆ˜๋„, OrderProductEntity ๋ฅผ ์ƒ์†ํ•œ List<? extends OrderProductEntity ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.
  • Hibernate๋Š” Collection ํƒ€์ž…์— ๋Œ€ํ•ด Generic ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋Ÿฐํƒ€์ž„์—์„œ ํƒ€์ž…์ด ๋™์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ญ”๊ฐ€ ๊ด€๋ จ๋œ ๊ฒƒ ๊ฐ™์€ ๋ฌธ์„œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ์ •ํ™•ํ•œ ํ•ด์„์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. (์ฐธ๊ณ )

 

Solution

Solution 1. MutableList๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ?

  • Intellij ์—์„œ๋Š” ์ด ๊ฒฝ์šฐ, MutableList๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๊ถŒ๊ณ ํ•œ๋‹ค.
  • ์™œ MutableList๋Š” ๋ ๊นŒ?
    • ์™œ๋ƒํ•˜๋ฉด…. MutableList๋Š” ๋ฌด๊ณต๋ณ€์ด๋‹ค. out ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์Œ.

⇒ ํ•˜์ง€๋งŒ orderProductList๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— MutableList๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค. (ํƒˆ๋ฝ)

Solution 2. Entity๋ฅผ ์ƒ์† ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค ?

  • OrderProductEntity๊ฐ€ open class ์ด๊ธฐ ๋•Œ๋ฌธ์—, List ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ™•ํžˆ ์–ด๋–ค ํƒ€์ž…์ด ๋“ค์–ด์˜ฌ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋‹ˆ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ผ๊ณ  ํŒ๋‹จํ•ด์„œ allOpen ์„ค์ •์„ ์ง€์›Œ๋ดค๋‹ค.
  • …. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ํ•ด๊ฒฐ์€ ๋๋‹ค.
  • ํ•˜์ง€๋งŒ, ๋ช‡ ์ฃผ ์ „ ์ผ€๋ธŒ๋‹˜์˜ JPA ์ง€์—ฐ๋กœ๋”ฉ ๋ฝ€๊ฐœ๊ธฐ ์—์„œ ๋“ค์—ˆ๋“ฏ์ด, @~ToOne ๊ด€๊ณ„์—์„œ ์ง€์—ฐ๋กœ๋”ฉ์„ ํ•  ๋•Œ JPA๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค.

⇒ ๊ทธ๋ž˜์„œ allOpen์„ ์ง€์šฐ๋Š” ๊ฑด ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์•„๋‹ˆ๋‹ค.

Solution 3. val ์„ ์‚ฌ์šฉํ•œ๋‹ค.

@OneToMany(cascade = [CascadeType.ALL], fetch = FetchType.LAZY, mappedBy = "order")
val orderProductList: List<OrderProductEntity>
  • var ๋Œ€์‹  val ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒ์„ฑํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋˜๊ณ  ๋ฐ”๋€Œ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— List ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

⇒ ํ•˜์ง€๋งŒ OrderProductEntity ๋Š” order ๋˜๋Š” orderId ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, OrderEntity๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ๋™์‹œ์— OrderProductEntity๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— val ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

Solution 4. targetEntity ์†์„ฑ์„ ์ด์šฉํ•œ๋‹ค.

๋ฒˆ์—ญ / (์„ ํƒ ์‚ฌํ•ญ) ์—ฐ๊ฒฐ ๋Œ€์ƒ์ธ ์—”ํ„ฐํ‹ฐ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜ ์†์„ฑ์ด Java ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฒฝ์šฐ์—๋งŒ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋œ ๊ฒฝ์šฐ ์ปฌ๋ ‰์…˜์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”๋œ ์œ ํ˜•์ด ๊ธฐ๋ณธ๊ฐ’์ž…๋‹ˆ๋‹ค.

  • ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋‹ˆ๊นŒ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์•„๋งˆ JPA ์—๊ฒŒ OrderProductEntity ๋˜๋Š” ? extends OrderProductEntity ํƒ€์ž…๋“ค ์ค‘ ์–ด๋–ค ํƒ€์ž…์„ ์‚ฌ์šฉํ• ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ˆ ํ•ด๊ฒฐ์ด ๋˜์—ˆ๋‹ค๊ณ  ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก