Я использую Play 2.0.4 Java. Есть два apis, один - для удаления деталей элемента из объекта канала, а другой - для добавления. Оба API используют Akka.future (). Как я могу избежать исключения ebean из Play (см. Ниже), когда оба apis называются очень близко, чтобы модифицировать один и тот же объект базы данных (одна и та же запись)?
Модельный объект
public class Channel extends Model {
.....
@OneToMany(cascade=CascadeType.ALL, mappedBy="channelInfo")
private Set members;
public void addMemberId(String memberId) {
List memberIdslList = this.getMemberIdsList();
if (!memberIdslList.contains(memberId)) {
ChannelDetailMember dMember = new ChannelDetailMember(memberId, this);
dMember.save();
membersCount++;
this.getMembers().add(dMember);
}
}
public void removeMemberId(String memberId) {
Iterator iter = this.getMembers().iterator();
while (iter.hasNext()) {
ChannelDetailMember dMember = iter.next();
if (dMember.getMemberId().equals(memberId)) {
dMember.delete();
iter.remove();
membersCount--;
break;
}
}
}
}
Запрос 1: Удалить член из списка членов канала объекта
public static Result removeMemberIdFromChannel(final String name, final String memberId) {
Promise promiseRemove = Akka.future(
new Callable() {
public ObjectNode call() {
Channel channel = find.where().eq("name", name).findUnique();
channel.removeMemberId(memberId);
}
}
)
.....
}
Запрос 2: Добавить член из списка участников канала объекта
public static Result addMemberIdToChannel(final String name, final String memberId) {
Promise promiseRemove = Akka.future(
new Callable() {
public ObjectNode call() {
Channel channel = find.where().eq("name", name).findUnique();
channel.addMemberId(memberId);
}
}
)
....
}
Исключения, которые я получил от Play, когда два запроса вызывают очень близко.
[error] play - Waiting for a promise, but got an error: Data has changed. updated [0] rows sql[update channel set members_count=?, update_date=? where id=? and channel_name=? and conversation_id=? and members_count=? and created_date=? and update_date=?] bind[null]
at com.avaje.ebeaninternal.server.persist.dml.UpdateHandler.execute(UpdateHandler.java:106) ~[ebean-2.7.3.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.update(DmlBeanPersister.java:85) ~[ebean-2.7.3.jar:na]
javax.persistence.OptimisticLockException: Data has changed. updated [0] rows sql[update channel set members_count=?, update_date=? where id=? and channel_name=? and conversation_id=? and members_count=? and created_date=? and update_date=?] bind[null]
at com.avaje.ebeaninternal.server.persist.dml.DmlBeanPersister.execute(DmlBeanPersister.java:105) ~[ebean-2.7.3.jar:na]
at com.avaje.ebeaninternal.server.persist.dml.DmlHandler.checkRowCount(DmlHandler.java:123) ~[ebean-2.7.3.jar:na]
at com.avaje.ebeaninternal.server.persist.DefaultPersistExecute.executeUpdateBean(DefaultPersistExecute.java:110) ~[ebean-2.7.3.jar:na]
at com.avaje.ebeaninternal.server.core.PersistRequestBean.executeNow(PersistRequestBean.java:531) ~[ebean-2.7.3.jar:na]