Skip to content

Commit 32b352d

Browse files
leeminseo0923claude
andcommitted
[no-issue]; fix: MultipleBagFetchException — @EntityGraph 제거, @batchsize 적용
두 개의 @onetomany List 컬렉션을 @EntityGraph로 동시에 JOIN FETCH하면 Hibernate MultipleBagFetchException이 발생한다. @EntityGraph를 제거하고 @batchsize(size=100)으로 교체하여 lazy 로딩 + IN절 배치 쿼리 방식으로 N+1 없이 해결. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent c08ffd0 commit 32b352d

2 files changed

Lines changed: 3 additions & 13 deletions

File tree

src/main/kotlin/com/yourssu/scouter/common/storage/domain/mail/JpaMailRepository.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.yourssu.scouter.common.storage.domain.mail
22

33
import com.yourssu.scouter.common.implement.domain.mail.reservation.MailReservationStatus
4-
import org.springframework.data.jpa.repository.EntityGraph
54
import org.springframework.data.jpa.repository.JpaRepository
65
import org.springframework.data.jpa.repository.Modifying
76
import org.springframework.data.jpa.repository.Query
@@ -10,56 +9,44 @@ import java.time.Instant
109
import java.util.Optional
1110

1211
interface JpaMailRepository : JpaRepository<MailEntity, Long> {
13-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
1412
override fun findById(id: Long): Optional<MailEntity>
1513

16-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
1714
override fun findAll(): List<MailEntity>
1815

19-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
2016
fun findAllByGroupId(groupId: Long): List<MailEntity>
2117

22-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
2318
fun findAllByReservationTimeLessThanEqual(reservationTime: Instant): List<MailEntity>
2419

25-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
2620
fun findAllByReservationTimeLessThanEqualAndStatusNot(
2721
reservationTime: Instant,
2822
status: MailReservationStatus,
2923
): List<MailEntity>
3024

31-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
3225
fun findAllByReservationTimeLessThanEqualAndStatusIn(
3326
reservationTime: Instant,
3427
statuses: Collection<MailReservationStatus>,
3528
): List<MailEntity>
3629

37-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
3830
fun findAllBySenderEmailAddress(senderEmailAddress: String): List<MailEntity>
3931

40-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
4132
fun findAllBySenderEmailAddressIn(senderEmailAddresses: List<String>): List<MailEntity>
4233

43-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
4434
fun findAllByReservationTimeLessThanEqualAndSenderEmailAddress(
4535
reservationTime: Instant,
4636
senderEmailAddress: String,
4737
): List<MailEntity>
4838

49-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
5039
fun findAllByReservationTimeLessThanEqualAndSenderEmailAddressIn(
5140
reservationTime: Instant,
5241
senderEmailAddresses: List<String>,
5342
): List<MailEntity>
5443

55-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
5644
fun findAllBySenderEmailAddressAndReservationTimeBetween(
5745
senderEmailAddress: String,
5846
from: Instant,
5947
to: Instant,
6048
): List<MailEntity>
6149

62-
@EntityGraph(attributePaths = ["recipientEmailAddress", "attachments"])
6350
fun findAllBySenderEmailAddressInAndReservationTimeBetween(
6451
senderEmailAddresses: List<String>,
6552
from: Instant,

src/main/kotlin/com/yourssu/scouter/common/storage/domain/mail/MailEntity.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import jakarta.persistence.Lob
1717
import jakarta.persistence.OneToMany
1818
import jakarta.persistence.Table
1919
import jakarta.persistence.Transient
20+
import org.hibernate.annotations.BatchSize
2021
import org.hibernate.annotations.JdbcTypeCode
2122
import org.hibernate.type.SqlTypes
2223
import java.time.Instant
@@ -46,8 +47,10 @@ class MailEntity(
4647
val status: MailReservationStatus = MailReservationStatus.SCHEDULED,
4748
@Column
4849
val claimedAt: Instant? = null,
50+
@BatchSize(size = 100)
4951
@OneToMany(mappedBy = "mail", fetch = FetchType.LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
5052
val recipientEmailAddress: MutableList<MailRecipientAddressEntity> = mutableListOf(),
53+
@BatchSize(size = 100)
5154
@OneToMany(mappedBy = "mail", fetch = FetchType.LAZY, cascade = [CascadeType.ALL], orphanRemoval = true)
5255
val attachments: MutableList<MailAttachmentEntity> = mutableListOf(),
5356
) {

0 commit comments

Comments
 (0)