I tried to simulate an optimistic Lock situation where you try to update the same record twice, but the exception is not triggered.
I think it's interesting that even after changing the value of the holder and giving a MERGE, the version value is not updated in the object or in the base record.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("financas");
EntityManager em1 = emf.createEntityManager();
EntityManager em2 = emf.createEntityManager();
em1.getTransaction().begin();
em2.getTransaction().begin();
Conta c1 = em1.find(Conta.class,1);
em1.lock(c1, LockModeType.OPTIMISTIC);
em1.merge(c1);
em1.getTransaction().commit();
Conta c2 = em2.find(Conta.class,1);
em2.lock(c2, LockModeType.OPTIMISTIC);
em2.merge(c2);
em2.getTransaction().commit();
------------- UPDATED ---------------------
Account Class Content:
package br.com.financas.modelo;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Version;
@Entity
public class Conta {
@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String titular;
private String banco;
private String agencia;
private String numero;
@Version
private int versao;
public int getVersao() {
return versao;
}
public void setVersao(int versao) {
this.versao = versao;
}
@OneToMany(mappedBy="conta")
private List<Movimentacao> movimentacoes;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitular() {
return titular;
}
public void setTitular(String titular) {
this.titular = titular;
}
public String getBanco() {
return banco;
}
public void setBanco(String banco) {
this.banco = banco;
}
public String getAgencia() {
return agencia;
}
public void setAgencia(String agencia) {
this.agencia = agencia;
}
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
public List<Movimentacao> getMovimentacoes() {
return movimentacoes;
}
public void setMovimentacoes(List<Movimentacao> movimentacoes) {
this.movimentacoes = movimentacoes;
}
}
Why the exception is not thrown?