У меня есть два объекта JPA, которые связаны друг с другом. Человек может быть членом или группой. Группа может иметь ноль или более членов.Как обрабатывать отношения JPA OneToMany в многопоточной среде
@Entity
public class PersonEntity {
@ManyToOne
@JoinColumn(name = "GROUP_ID")
private GroupEntity group;
}
@Entity
public class GroupEntity {
@OneToMany(mappedBy = "group", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH })
private Collection<PersonEntity> persons;
}
Проблема, с которой я сталкиваюсь, заключается в том, что несколько потоков могут удалить/добавить людей в группу. Поэтому, когда два потока удаляют человека из одной группы, каждый из них не знает, что произошло в другом потоке.
- персоны и personB принадлежат группа1
- Резьба1 удаляет персона из group1
- thread2 удаляет personB из group1
- thread1 делают некоторые постобработки с personB
- thread2 делают некоторые пост-обработку с персонами
Я знаю, что могу обернуть это все в синхронизированном блоке, но это не помогло бы мне, если приложение работающих на нескольких компьютерах, которые совместно используют базу данных.
Как JPA может знать, что коллекция на GroupEntity была изменена другим потоком?
Вообще-то его дело бережно связано с транзакцией базы данных. Может быть, вы должны изучить это. Какова среда, в которой вы используете код? Сервер приложений или автономный проект? Или вы хотите, чтобы объекты Java сохраняли синхронизацию для каждого потока? –
Удаление производится в транзакции. Постобработка выполняется после фиксации. – TomVW