Sto usando Ebean con Play Framework 2 ed a volte cade con OptimisticLockException di questo tipo:OptimisticLockException con Ebean and Play Framework 2
play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[OptimisticLockException: Data has changed. updated [0] rows sql[update manager set modification_time=?, session_id=?, expiration_date=? where id=? and rating=? and creation_time=? and modification_time=? and name=? and surname=? and login=? and password_hash=? and email=? and session_id=? and expiration_date=?] bind[null]]]
Questo succede quando pochi attori iniziano a accedere al database.
Quindi, classe Manager è:
public class Manager extends Model {
@Getter @Setter
Long id;
@Getter @Setter
private String name;
@Getter @Setter
private String surname;
@Column(unique = true)
@Getter @Setter
private String login;
@Getter @Setter
private String passwordHash;
@Getter @Setter
private String email;
@Embedded
@Getter @Setter
private ManagerSession session;
@Getter
private Timestamp creationTime;
@Getter
private Timestamp modificationTime;
@Override
public void save() {
this.creationTime = new Timestamp(System.currentTimeMillis());
this.modificationTime = new Timestamp(System.currentTimeMillis());
super.save();
}
@Override
public void update() {
this.modificationTime = new Timestamp(System.currentTimeMillis());
super.update();
}
}
Salva ganci() e update() utilizzati annotazioni invece @PrePersist, a causa della Ebean non lo supporta. Come noto, l'annotazione della versione porta sempre la modalità di blocco ottimistico, quindi inizio a utilizzare tale trucco. So cos'è il blocco di Optimistick, ma come dovrebbe essere risolta questa situazione, quando molti attori dovrebbero modificare lo stesso record db, dove vince l'ultima modifica?
Sì, hai ragione. Ma il mio problema non era qui. Il problema era nell'annotazione di @Version nella gerarchia di classi. Ad ogni modo, la tua risposta è molto utile per chi deve affrontare un tale problema per la prima volta. Lascia che sia accettato. –
Come si ottiene ** id ** per chiamare * Venue.find.byId (id)) * prima del bind del modulo? –