Backend/Spring

[SpringBoot] JPA - PersistentBag

Coffebara 2024. 3. 27. 22:02

 

  • 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드로 감싸서 사용

 

PersistentCollection

Hibernate에서 제공하는 인터페이스로, 엔티티의 컬렉션 타입 필드를 관리하는 데 사용.

 

하이버네이트의 내장 컬렉션 필드

컬렉션 인터페이스 내장 컬렉션 중복 허용 순서 보관
Collention, List PersitentBag O X
Set PersistentSet X X
List + @ORderColumn PersistentList O O

 

 

PersistentBag

public class PersistentBag<E>
extends AbstractPersistentCollection<E>
implements List<E>
동일한 요소를 여러 번 포함할 수 있는 순서가 없고 키가 지정되지 않은 컬렉션입니다.
Java 컬렉션 API에는 Bag 이 없습니다 .
Bag 의미론을 표현하기 위해 List 를 사용하는 것 같으므로 Hibernate는 이 관행을 따릅니다.

 

 

 

발생한 오류

Could not set value of type [org.hibernate.collection.spi.PersistentBag]: 'cohttp://m.behd.beHappyDog.Entity.Dog.dogImgs' (setter)

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(exclude = {"dogImgs"}) // 무한루프 방지
public class Dog extends BaseEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "dog_id")
    private Long id;
    private String dogName;

    @OneToMany(mappedBy = "dog", cascade = ALL)
    private ArrayList<DogImg> dogImgs = new ArrayList<>();
}

 

 연관 관계를 맺은 엔티티 DogImg가 컬렉션으로 영속성에 올라갈 때 하이버네이트에 의해 내장 래퍼로 감싸진다.

이 때 Collection이 ArrayList 이므로 PersitentBag 인스턴스로 감싸지는데, Java에서는 List로 받아야하지만 ArrayList형으로 만들었기 때문에 생긴 오류였다. 

 그러므로 ArrayList를 List로 바꾸면 문제 해결 !

 

 

참고

https://docs.jboss.org/hibernate/orm/6.2/javadocs/org/hibernate/collection/spi/AbstractPersistentCollection.html

https://milenote.tistory.com/148