Ajuda com Locking do JPA

Eu estou tentando aprender um pouco mais sobre os recursos de Locking to JPA2. Comecei, então, lendo este artigo da Carol McDonald mas não consigo fazer os exemplos funcionarem. Veja o exemplo sobre lock otimista da figura 2. P/ testa-lo eu usei o seguinte código:

EntityManager em0 = emf.createEntityManager();
EntityManager em1 = emf.createEntityManager();

System.out.println("em0 = " + em0);
System.out.println("em1 = " + em1);
        
em0.getTransaction().begin();
em1.getTransaction().begin();

Pais p0 = em0.find(Pais.class, 1);
Estado e1 = em1.find(Estado.class, 1);

Pais p1 = e1.getPais();
em1.lock(p1, LockModeType.OPTIMISTIC);

p0.setTeste(p0.getTeste() + 1);
e1.setTeste(e1.getTeste() + 1);

em0.getTransaction().commit();
em1.getTransaction().commit();

No artigo Carol fala q o lock otimista é adequado p/ quando vc tem dependências entre duas ou mais entidades e vc precisa garantir consistência. De acordo com o artigo da Carol a segunda transação deveria falhar pq o objeto em q eu dei lock (em1.lock(p1, LockModeType.OPTIMISTIC)) foi atualizado em uma transação concorrente e, no commit da segunda transação, a diferença de versões seria detectada pelo JPA. De fato esse código executa até a ultima linha e as duas entidades são atualizadas com sucesso.

Agora, alguém sabe me dizer onde eu estou errando?

Sua entidade tem o campo de versão?

Abs

Ops…

Alias, sua entidade e o banco…
No exemplo que vc mandou ela anota a entidade mas não coloca o campo no banco…

Um exemplo meu.

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "iduser", nullable = false)
    private Long iduser;

    @Version
    @Column(name = "usversion")
    private long version;

Não esqueça de ao criar a coluna na tabela dar um updatena versão para o numero 1 em todas as linhas, ai quando você alterar alguma linha a JPA vai incrementar o campo.

Abraço.

Rodrigo