두 엔티티 USER 및 NOTIFICATION이 있다고 가정 해 보겠습니다. 그리고 저는 아래와 같이 관계를 맺고 있습니다.JPA OneToMany :리스트 대 세트
public class UserAccount{
@Id
@Column(name = "USER_NAME")
private String emailid;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "USERS_NOTIFICATIONS", joinColumns = { @JoinColumn(name = "USER_NAME") }, inverseJoinColumns = { @JoinColumn(name = "NOTIFICATION_ID") })
private List<Notification> notifications;
//setters, getter, equals and hashcode
}
나는 equals와 hashcode (비즈니스 키/기본 키로 생성 된 IDE)를 오버라이드했습니다. 사용자 A가 있다고 가정 해보십시오. 첫 번째 알림을 추가하면 일반 삽입 문이 생깁니다. 그러나 동일한 사용자에 대한 추가 기능을 추가하면 삭제 한 다음 삽입합니다. 로그입니다 :
Hibernate: delete from USERS_NOTIFICATIONS where USER_NAME=?
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
Hibernate: insert into USERS_NOTIFICATIONS (USER_NAME, NOTIFICATION_ID) values (?, ?)
//as many inserts as the notifications the user has
모든 사용자에게 동일한 결과가 발생합니다. 이제 Set with List를 바꾸면 정상적인 삽입이 발생합니다. 그리고 doucmentation과 blog을 읽은 후에 이유를 발견했습니다. 단방향 OneToMany 연결 설정 프리젠
- 에서
관측이 바람직하다.
는 인덱싱 된 콜렉션 및 세트 요소들을 추가하고, 제거하고 업데이트의 측면에서 가장 효율적인 작업을 할 수 있음을 분명히해야한다. 양방향 OneToMany 관계에서
- 은 (ManyToOne의 관리) 목록 및 가방 효율적입니다.
가방 및 목록 질문
커플 가장 효율적인 역 모음입니다
- 합니까 내가 단방향 OneToMany 맵핑의 목록을 통해 설정을 선호 할이 평균 (꽤 분명하지만)? 하지만 해결 방법이 있습니까?
- 또는 중복이있을 때 목록을 사용하는 데 양방향 관계가되도록 도메인을 조정해야합니까?
주문을 원할 때 List를 사용하고 그렇지 않을 때는 Set을 사용한다고 생각했을 것이다. 지속성 솔루션과 상관없이 모델링 할 필요가있는 것을 기반으로 모델을 선택하십시오. 모든 퍼시스턴스 솔루션은 어느 하나를 처리 할 수 있어야합니다. – DataNucleus
@DataNucleus : 하나는 그렇게 생각했을 것입니다. Hibernate가 단방향 맵에 효율적으로 추가하는 것을 처리 할 것이라고 생각할 수도있다. 때로는 사람들이 생각이 잘못되었다는 것을 알게됩니다! –
@DataNucleas : 나는 그런 식으로 생각했다.하지만 위에서 언급 한 문제를 얻은 후 문서를 통해 나는 그 이상을 발견했다. – shazinltc