У меня есть следующее:
public class Member {
@Id
@Column
private String id;
@Column
private String location;
// setters/getters
}
Я должен реализовать следующие бизнес-правила:
Установить местоположение:
- Получить член из БД на основеid.
- Если местоположение равно нулю, присвойте ему значение и сохраните, в противном случае ничего не делайте.
public void setLocation(String id, String location){
Member m = memberDao.find(id); // assume m is not null
if(null == m.getLocation()){
m.setLocation(location);
memeberDao.saveOrUpdate(m);
}
else
throw new MemberAlreadyHasALocationException();
}
Удалить местоположение:
- Получитьчлен из БД на основе идентификатора.
- Если для местоположения задано ненулевое значение, а текущее значение равно значению параметра, установите для местоположения нулевое значение и обновите, в противном случае ничего не делайте
public void removeLocation(String id, String location){
Member m = memberDao.find(id);
if(m.getLocation() != null && m.getLocation.equalsIgnoreCase(location)){
m.setLocation(null);
memeberDao.saveOrUpdate(m);
}
}
Мне поручено решать проблемы параллелизма, но я не уверен, как это сделать в спящем режиме.Более конкретно, как я могу обрабатывать одновременные вызовы setLocation для одного и того же идентификатора, учитывая, что у объекта с этим идентификатором в настоящее время нет местоположения.
По сути, первое обновление должно выиграть, а второе - не получится.
Достаточно ли добавить версию в класс Member
@Version
@Column(name="version")
private Long version;
Однако, скажем, что есть поле пола, я бы хотел обновить поле пола, не заботясь, еслиместоположение обновляется другой транзакцией.
Спасибо.