Problema com @Version

e ai galera,
estou tendo um probleminha com @Version

model

@Entity
@Table(name = "pedirMusica")
@SequenceGenerator(name = "pedirMusica_id_seq", sequenceName = "pedirMusica_id_seq", allocationSize = 1)
public class PedirMusica implements Serializable{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pedirMusica_id_seq")
    @Column(name = "id", nullable = false)
    private Long id;
    @Column(name = "descricaomusica", length = 20)
    private String descricaoMusica;
    @Column(name = "artistabanda", length = 20)
    private String artistaBanda;
    @Column(name = "descricaoouvinte", length = 40)
    private String descricaoOuvinte;
    @Column(name = "bairro", length = 30)
    private String bairro;

    //campos de controle
    
    @Version
    @Column(name = "versao")
    private long versao;
    @Column(name = "status")
    private Boolean status;
    @Column(name = "idusuario")
    private Long idUsuario;
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "dataregistro")
    private Date dataRegistro;
    @Column(name = "enderecoip", length = 20)
    private String enderecoIp;
    
    public PedirMusica() {
    }

    public String getArtistaBanda() {
        return artistaBanda;
    }

    public void setArtistaBanda(String artistaBanda) {
        this.artistaBanda = artistaBanda;
    }

    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getDescricaoMusica() {
        return descricaoMusica;
    }

    public void setDescricaoMusica(String descricaoMusica) {
        this.descricaoMusica = descricaoMusica;
    }

    public String getDescricaoOuvinte() {
        return descricaoOuvinte;
    }

    public void setDescricaoOuvinte(String descricaoOuvinte) {
        this.descricaoOuvinte = descricaoOuvinte;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Date getDataRegistro() {
        return dataRegistro;
    }

    public void setDataRegistro(Date dataRegistro) {
        this.dataRegistro = dataRegistro;
    }

    public String getEnderecoIp() {
        return enderecoIp;
    }

    public void setEnderecoIp(String enderecoIp) {
        this.enderecoIp = enderecoIp;
    }

  

   public Long getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(Long idUsuario) {
        this.idUsuario = idUsuario;
    }

    public Boolean getStatus() {
        return status;
    }

    public void setStatus(Boolean status) {
        this.status = status;
    }
        public long getVersao() {
        return versao;
    }

    public void setVersao(long versao) {
        this.versao = versao;
    }


}

controller

@Resource
public class PedirMusicaController extends DefualtController {

    private List<PedirMusica> pedirMusicaList = null;
    private PedirMusicaBO pedirMusicabo = null;

    public PedirMusicaController(Dao dao, Result result, CurrentUser user, Validator validator, HttpServletRequest request) {
        this.dao = dao;
        this.result = result;
        this.currentUser = user;
        this.validator = validator;
        this.request = request;
        this.pedirMusicabo = new PedirMusicaBO(dao);

    }

    @Get
    @Path("/pedirMusica/detalhes/{pedirMusica.id}")
    public PedirMusica detalhes(PedirMusica pedirMusica) {
        return pedirMusicabo.procura(pedirMusica);
    }

    @Get
    @Post
    @Path(priority = 1, value = "/pedirMusica/formulario/")
    public PedirMusica formulario() {
        return null;
    }

    @Get
    @Path(priority = 2, value = "/pedirMusica/formulario/{pedirMusica.id}")
    public PedirMusica formulario(PedirMusica pedirMusica) {
        return pedirMusica != null && pedirMusica.getId() > 0 ? (PedirMusica) pedirMusicabo.procura(pedirMusica) : null;
    }

    @Post
    @Get
    @Path("/pedirMusica/lista/")
    public List<PedirMusica> lista(PedirMusica pedirMusica) throws Exception {
        pedirMusicaList = pedirMusicabo.lista(pedirMusica);
        result.include("pedirMusica", pedirMusica);
        return pedirMusicaList;
    }

    @Path("/pedirMusica/remove/{pedirMusica.id}")
    public void remove(PedirMusica pedirMusica) throws Exception {
        try {
            pedirMusicabo.remove(pedirMusicabo.procura(pedirMusica));
            if (!validator.hasErrors()) {
                success("Registro deletado com sucesso.");
                result.redirectTo(PedirMusicaController.class).lista(null);
            }
        } catch (Exception e) {
            error(e.getMessage());
        }
        validator.onErrorUse(Results.logic()).redirectTo(PedirMusicaController.class).lista(pedirMusica);
    }
    
    @Post
    public void salva(PedirMusica pedirMusica) {
        try {
            setMacTime(pedirMusica);
            pedirMusica = (PedirMusica) pedirMusicabo.armazena(pedirMusica);
        } catch (Exception e) {
            error(e.getMessage());
        }
        if (!validator.hasErrors()) {
            success("Registro salvo com sucesso.");
             result.include("pedirMusica", pedirMusica).redirectTo(this).detalhes(pedirMusica);          
        }
        validator.onErrorUse(Results.logic()).redirectTo(PedirMusicaController.class).formulario(pedirMusica);
    }

    private void setMacTime(PedirMusica pedirMusica) {
        if (pedirMusica.getId() == 0 || pedirMusica.getId() != 0) {
            try {
                pedirMusica.setIdUsuario(currentUser.getAdmin().getId());
                pedirMusica.setEnderecoIp(InetAddress.getByName(request.getHeader("x-forwarded-for")).getHostAddress());
                pedirMusica.setDataRegistro(new Date());

            } catch (Exception ex) {
                Logger.getLogger(PedirMusicaController.class.getName()).log(Level.SEVERE, null, ex);
                error(ex.getMessage());
            }
        }
    }
}

galera esta acontecendo o seguinte problema
quando eu salvo o registro a primeira vez o campo versao == 0,
quando eu coloco para editar o registro a primeira vez o campo versao == 1,
mas quando eu tento editar o registro novamente aparece a seguinte mensagem
[color=red]org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [br.com.radio.model.PedirMusica#156] [/color]

alguém pode me ajudar.

Você ta fechando a conexão?

estou abrindo a conexão direto do xml
web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>Radio</display-name> <context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.util.hibernate</param-value> </context-param> <context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <!--<error-page> <error-code>403</error-code> <location>/WEB-INF/jsp/erros/403.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/WEB-INF/jsp/erros/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/jsp/erros/500.jsp</location> </error-page>--> </web-app>

dao

[code]@Component
public class Dao {
private final Session session;

public Dao(Session session) {
    this.session = session;
}

public Session getSession() {
    return session;
}

public void remove(Object dto) throws Exception {
    try {
        this.session.delete(dto);
    } catch (Exception e) {
        throw new Exception(e.toString());
    }
}

public Object salva(Object dto) throws Exception {
    try {
        dto = this.session.merge(dto);
    } catch (Exception e) {
        throw new Exception(e.toString());
    }
    return dto;
}

public void persiste(Object dto) throws Exception {
    try {
        this.session.persist(dto);
    } catch (Exception e) {
        throw new Exception(e.toString());
    }
}

public void salvaLista(ArrayList lista) throws Exception {
    try {
        for (Object dto : lista) {
            this.session.persist(dto);
        }
    } catch (Exception e) {
        throw new Exception(e.toString());
    }
}

public List<T> listaTudo(Class classe) {
    return this.session.createCriteria(classe).list();
}

public Object procura(Class classe, Long id) {
    return (Object) session.load(classe, id);
}

public Object get(Class classe, Long id) {
    return (Object) session.get(classe, id);
}

}
[/code]

Blz, abre no web.xml.

E lá tá fechando?

ele fecha automaticamente
quando se usa direto no web.xml

[quote=julho]não sei como fechar
ele não fecha automaticamente não quando se usa direto no web.xml?[/quote]Não entendo de VRaptor. Sorry.

blz então

[quote]estou abrindo a conexão direto do xml …
web.xml [/quote]

Você tá fechando sessão hibernate ?

session.close();

[quote=Aleksandro][quote]estou abrindo a conexão direto do xml …
web.xml [/quote]

Você tá fechando sessão hibernate ?

session.close();

[/quote]No caso da injeção do VRaptor precisa de fechar a transação na unha? :shock:

[quote=Hebert Coelho][quote=Aleksandro][quote]estou abrindo a conexão direto do xml …
web.xml [/quote]

Você tá fechando sessão hibernate ?

session.close();

[/quote]No caso da injeção do VRaptor precisa de fechar a transação na unha? :shock: [/quote]

Não sei se ele tá acompanhando alguma apostila ou algo do tipo … pela mensagem em si , o erro é bem isto e também não vi o hibernateutil que ele descreve no web.xml , talvez lá não esteja fazendo o close … o correto era não precisar fazer na mão …enfim é uma suposição …pode ser isto …

[quote=Aleksandro][quote=Hebert Coelho][quote=Aleksandro][quote]estou abrindo a conexão direto do xml …
web.xml [/quote]

Você tá fechando sessão hibernate ?

session.close();

[/quote]No caso da injeção do VRaptor precisa de fechar a transação na unha? :shock: [/quote]

Não sei se ele tá acompanhando alguma apostila ou algo do tipo … pela mensagem em si , o erro é bem isto e também não vi o hibernateutil que ele descreve no web.xml , talvez lá não esteja fazendo o close … o correto era não precisar fazer na mão …enfim é uma suposição …pode ser isto …[/quote]Eu perguntei pois não sei como funciona. Ele mesmo disse ali em cima que não sabia como fechar, e já supunha que tudo era feito automático. Eu também pensaria que é assim também. Mas, prefiro deixar alguém que saiba de VRaptor falar. Por isso te perguntei, achei que o funcionamento seria igual ao da transação do EJB. ^^

Pessoal,

Com o Vraptor você pode criar um provedor de conexão ou utilizar um que já vem por padrão no projeto, para isso basta colocar o código abaixo no web.xml, sendo assim quando temos a dependencia do EntityMananer o Vraptor já saberá como trata-la.

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>
        br.com.caelum.vraptor.util.jpa
    </param-value>
</context-param>

Se não me engano o Vraptor vai criar um interceptador e trabalhar com o conceito de Open Session In View !
Sendo assim ele SEMPRE irá fechar a conexão após exibir a pagina, sem você ter que controlar isso na mão.

Percebi que você esta usando diretamente a Session do Hibernate então segue abaixo um link mostrando como configurar o Vraptor com Hibernate.

http://vraptor.caelum.com.br/pt/docs/componentes-utilitarios-opcionais/

Espero ter ajudado.

[quote=magnocosta]Pessoal,

Com o Vraptor você pode criar um provedor de conexão ou utilizar um que já vem por padrão no projeto, para isso basta colocar o código abaixo no web.xml, sendo assim quando temos a dependencia do EntityMananer o Vraptor já saberá como trata-la.

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>
        br.com.caelum.vraptor.util.jpa
    </param-value>
</context-param>

Se não me engano o Vraptor vai criar um interceptador e trabalhar com o conceito de Open Session In View !
Sendo assim ele SEMPRE irá fechar a conexão após exibir a pagina, sem você ter que controlar isso na mão.

Percebi que você esta usando diretamente a Session do Hibernate então segue abaixo um link mostrando como configurar o Vraptor com Hibernate.

http://vraptor.caelum.com.br/pt/docs/componentes-utilitarios-opcionais/

Espero ter ajudado.[/quote]Legal! Não sabia. [=

magnocosta
eu já to abrindo e fechando a sessão
é só olhar no meu we.xml que eu já postei…

br.com.caelum.vraptor.packages br.com.caelum.vraptor.util.hibernate

Julho ,

Percebi apenas complementei a informaçãoo !

Abraço !

Desculpe mano,
mas valeu pela dica!

Se descobri onde esta meu erro me da um toque.

Abraço

[quote=magnocosta]Pessoal,

Com o Vraptor você pode criar um provedor de conexão ou utilizar um que já vem por padrão no projeto, para isso basta colocar o código abaixo no web.xml, sendo assim quando temos a dependencia do EntityMananer o Vraptor já saberá como trata-la.

<context-param>
    <param-name>br.com.caelum.vraptor.packages</param-name>
    <param-value>
        br.com.caelum.vraptor.util.jpa
    </param-value>
</context-param>

Se não me engano o Vraptor vai criar um interceptador e trabalhar com o conceito de Open Session In View !
Sendo assim ele SEMPRE irá fechar a conexão após exibir a pagina, sem você ter que controlar isso na mão.

Percebi que você esta usando diretamente a Session do Hibernate então segue abaixo um link mostrando como configurar o Vraptor com Hibernate.

http://vraptor.caelum.com.br/pt/docs/componentes-utilitarios-opcionais/

Espero ter ajudado.[/quote]

Isto eu sabia, o que eu to estranhando no erro em questão é que tem haver com o fechamento da sessão no hibernate , eu já usei algumas vezes o vraptor e conheço um pouco o seu comportamento … de qualquer forma o que se pode fazer neste caso é limpar o projeto , limpar os caches do browser , limpar as pastas dos projetos no servidor e subir novamente a aplicação e nos enviar os logs , pois assim acredito que poderemos ajudar de um outra maneira , pois somente o erro postado deixa muitas dúvidas, fica a dica, abs.

Já fiz isso,
mas ão deu certo.
O erro ainda continua

Solicite ajuda ao Lucas Cavalcanti. Se não me engano ele é um dos criadores do VRaptor. [=