Скажем, у меня есть два объекта USER и NOTIFICATION. И у меня есть отношения, как показано ниже.
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
}
У меня есть переопределенные равные и хэш-коды (IDE, сгенерированные с помощью моего бизнес-ключа/первичного ключа). Скажем, у меня есть пользователь A. Когда я добавляю первое уведомление, я получаю нормальную инструкцию insert. Но при дальнейшем добавлении для того же пользователя он удаляет и затем вставляет. Это журнал:
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
То же самое происходит с каждым пользователем. Теперь, если я заменю List with Set, произойдет обычная вставка. И я нашел причину после прочтения doucmentation и blog.
Наблюдения из документов
- В однонаправленной ассоциации OneToMany предпочтительнее Set.
должно быть ясно, что индексированные коллекции и наборы позволяют наиболее эффективную операцию с точки зрения добавления, удаления и обновления элементов.
- В двунаправленных отношениях OneToMany (управление ManyToOne) список и сумки эффективны.
Суммы и списки являются наиболее эффективными обратными коллекциями
Несколько вопросов
- Означает ли это, что я должен предпочесть набор над списком в однонаправленном сопоставлении OneToMany (довольно очевидно)? Но есть ли работа?
- Или мне нужно настроить мой домен, чтобы сделать его двунаправленным отношением для использования списка, например, когда у меня есть дубликаты.