1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Hibernate 4 - @Version não funciona

Amigos,

estou testando uma forma de controlar facilmente a concorrencia no hibernate 4. Achei a tal da annotation @version, que, segundo indicações do grande oráculo, resolveria a questão.

Com isso, eu esperava que desse erro a seguinte operação (considerem a existência de um registro na tabela, com nome "FULANO" e versão 1):

a) acesso o caso de uso em duas guias diferentes (mesma sessão, conversações diferentes);

b) em ambas as guias seleciono o registro do FULANO para edição e a tela de manutenção de dados é aberta;

c) numa das guias mudo o nome para "BELTRANO" e na outra guia "CICRANO";

d) salvo o Beltrano, o hibernate carimba versão 2 no registro e volto para a lista de jogadores cadastrados.

e) ao salvar o Cicrano, eu esperava que o hibernate "percebesse" que o Cicrano tem versão 1 e a ultima versão do registro JÁ ESTÁ em 2 (culpa do Beltrano). Mas não: ele sobrepõe o nome do Beltrano para Cicrano e a versão do registro passa a ser 3.

Esta é a parte relevante da minha entidade anotada:

@Entity
public class Jogador implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @Version
    private Long versao;

    private String nome;

// contrutores, getters, setters, etc...

}

E aqui a parte relevante do managedbean que efetua o update do registro:


    public String alterar(Jogador objeto) {

        try {

            objeto = getEntityManager().merge(objeto);
            getEntityManager().flush();

            if (objeto!=null){

                adicionaMensagemSucesso("Jogador alterado com sucesso");

                return "deucerto";

            }

        } catch (Exception ex) {

        }

        return "deuerrado";

    }

Se alguém tiver uma dica, agradeço.

Abraço a todos

========== EDITADO PARA RESPONDER UMA QUESTÃO DOS COMENTÁRIOS ==========

Esse é o jpaController

@Stateless
public class JogadorJpaController implements Serializable {

    @PersistenceContext(unitName = "campeonatoPU", type =   PersistenceContextType.EXTENDED)
    private EntityManager entityManager;


    public JogadorJpaController() {
    }

    public boolean alterar(Jogador objeto) throws Exception {

        entityManager.merge(objeto);

        entityManager.flush();

    }

}

Eu injeto o jpacontroller no meu managedbeand assim:

    @EJB
    JogadorJpaController jogadorJpaController;

E uso o metodo de alteracao assim:

jogadorJpaController.alterar(objeto);

Será que o pulo do gato é esse stateless ?

Que cês acham?

  • Quando você envia o bean para persistência ele esta indo com a versão no obejto?

    Dilnei Cunha   26 de set de 2014
  • Sim, amigo. Coloquei um breakpoint, debuguei o bicho e ele está lá preenchidíssimo com o carregado no último update.

    bonissauro   26 de set de 2014
  • que coisa, eu uso a mesma tecnologia e funciona muito bem, é tudo altomagico assim mesmo, apenas declaro o @version e seus set's get's na entidade, e caso o 2 acessem o mesmo registro carrega a versão atual do obejto na tela, coloco num hidden, o primeiro user edita o registro/salva, o segundo vai editar e salvar e toma um OptimisticLockException eu trato e mostro uma mensagem amigável.

    Dilnei Cunha   26 de set de 2014
  • Também uso @Version e funciona certinho. No teu caso parece que os objetos ainda estão managed. Como é feito o controle transacional? Você faz uso do entityManager direto no managedbean?

    Jeandeson   27 de set de 2014
  • ahammm, essa é a pergunta que trás a resposta.

    Dilnei Cunha   27 de set de 2014
Mostrar todos os 9 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags hibernate cdi controller ou faça a sua própria pergunta.