- 하이버네이트는 엔티티를 영속 상태로 만들 때 컬렉션 필드로 감싸서 사용
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로 바꾸면 문제 해결 !
참고
'Backend > Spring' 카테고리의 다른 글
API 요청 - RestTemplate, WebClient, RestClient (1) | 2024.11.07 |
---|---|
YAML 설정 값 가져오기 (0) | 2024.11.06 |
JDBC 이해 (0) | 2024.08.25 |
파일 업로드 (0) | 2024.08.23 |
[Spring Security 6] - 현재 인증된(로그인) 유저 정보 가져오기 (0) | 2024.01.19 |