VRaptor3 + Hibernate Annotations, insert, update e delete em cascata

Galera, estou com a seguinte dificuldade. Tenho minhas tabelas abaixo:

[quote]person 0xN address
person 1x1 serviceProvider
serviceProvider 1x1 corporation
serviceProvider 1x1 individual[/quote]

Sou novato em hibernate, essa é minha primeira aplicação com esse framework. E tenho algumas duvidas.
Então, tinha tentado uma abordagem para fazer os inserts por herança de classes, onde era Person(classe pai), ServiceProvider(classe filha) e Corporation ou Individual(classe neta).

Porque minha intensão era somente fazer:

Corporation corp = new Corporation();// o codigo não é exatamente assim, é somente uma explicação
corp.set......
IDao<Corporation> dao = new Dao<Corporation>();
//depois de todas as propriedades das classes acima setadas!
dao.save(corp);
//onde eu imaginei que o hibernate iria se virar fazendo os demais inserts(ServiceProvider e Person)

Perdi um certo tempo com o código acima sem sucesso, dai vi que minha abordagem estava errada, mais pra que mesmo que eu precisaria de herança??? Queria faciliar o meu trabalho.
Resolvi que iria inserir um por um:

[code]public void create(Person person, ServiceProvider serviceProvider, Corporation corporation, Address address){
this.session.save(address);

	person.setAddress(address);
	this.session.save(person);
	
	serviceProvider.setPerson(person);
	this.session.save(serviceProvider);
	
	corporation.setServiceProvider(serviceProvider);
	this.session.save(corporation);
}[/code]

Opa dai tudo funcionou, perfeito.

DUVIDA 1:
Agora vem o pior, tentei a mesma abordagem para update, e… erro:

public void update(Person person, ServiceProvider serviceProvider, Corporation corporation, Address address){ this.session.update(address); this.session.update(person); this.session.update(serviceProvider); this.session.update(corporation); }
Address vem sempre null.

DUVIDA 2:
E o delete tambem não funciona, eu setei pra todas as propriedades que foram mapeadas como OneToOne para cascade = CascadeType.All, com o codigo abaixo:

public void delete(Person person){ this.session.delete(person); }
Mesma coisa, não consigo excluir porque da erro de fk, mais se esta para deletar em cascata, o que pode estar errado.

Agora sobre o VRaptor, esta correta essa abordagem?

[code]@Get
@Path("/serviceProviderCorporation/{serviceProviderCorporation.id}")
public void show(Person serviceProviderCorporation){
Person person = this.dao.findById(serviceProviderCorporation.getId());

	Address address = person.getAddress();
	ServiceProvider serviceProvider = person.getServiceProvider();
	Corporation corporation = person.getServiceProvider().getCorporation();
	
	result.include("person", person)
	      .include("address", address)
	      .include("serviceProvider", serviceProvider)
	      .include("corporation", corporation);
}[/code]

Ola Davis!

Onde voce fala que deu erro, voce poderia postar o erro? (stacktrace)

abracos

sobre a parte do VRaptor a abordagem está certa sim… mas vc não precisa adicionar todos esses objetos…

vc pode usar na jsp

${person.address}
${person.serviceProvider}
${person.serviceProvider.corporation}

mas isso é do seu gosto…

Opa, desculpe a demora, como estou tendo somente o horário depois das aulas, esta meio complicado.
Mais a stacktrace do update esta abaixo:

[quote]HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: org.hibernate.TransientObjectException: The given object has a null identifier: com.greenlemon.portalchamadoweb.model.Address
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:76)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:74)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
com.greenlemon.portalchamadoweb.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:50)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

root cause

org.hibernate.TransientObjectException: The given object has a null identifier: com.greenlemon.portalchamadoweb.model.Address
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.getUpdateId(DefaultSaveOrUpdateEventListener.java:249)
org.hibernate.event.def.DefaultUpdateEventListener.getUpdateId(DefaultUpdateEventListener.java:46)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:217)
org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java:33)
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:564)
org.hibernate.impl.SessionImpl.update(SessionImpl.java:552)
org.hibernate.impl.SessionImpl.update(SessionImpl.java:544)
com.greenlemon.portalchamadoweb.dao.ServiceProviderCorporationDao.update(ServiceProviderCorporationDao.java:43)
com.greenlemon.portalchamadoweb.controller.ServiceProviderCorporationController.update(ServiceProviderCorporationController.java:45)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:50)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:83)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.multipart.MultipartInterceptor.intercept(MultipartInterceptor.java:74)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
com.greenlemon.portalchamadoweb.interceptor.AuthorizationInterceptor.intercept(AuthorizationInterceptor.java:50)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:45)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20[/quote]

Como eu havia dito, endereço vem sempre null.

E para deletar acontece esse erro, mais como esta para deletar em cascata eu não entendi nada.

[quote]HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:253)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:46)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

root cause

java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (portal.service_provider, CONSTRAINT FK35112C3B416A4277 FOREIGN KEY (person_id) REFERENCES person (id))
com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1669)
com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1085)
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:172)
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:46)
br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:40)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:51)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:45)
br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:60)
br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
Apache Tomcat/6.0.20[/quote]

Outra coisa, a respeito do hibernate, estive pesquisando e vi que a se eu anotasse a coleção com fetch = FetchType.LAZY, os objetos relacionado no com o atual não viriam no select, no caso não teria left join.
Mais pelo que eu percebi, todas as minhas classes que tem relacionamento estão anotadas dessa forma, mais ainda sim esta acontecendo de trazer os objetos relacionados com o atual, no caso fazendo left join.
Tem como fazer com que o hibernate não traga os objetos relacionados. Ou melhor ainda fazer isso dinamicamente, onde eu especifique o momento em que é para trazer os objetos relacionados, no caso eu trago o objeto Person para a session, dai fica tudo que esta relacionado a Person na session, e eu preciso somente de três informações de Person, já no caso onde eu vou atualizar, o hibernate trazer os objetos relacionados já é de grande ajuda, que dai eu não preciso fazer hql ou criteria, :lol: .

Valeu!

Ola Davi!

Isso é algo inerente ao hibernate. Voce esta gravando uma entidade que possui relacionamento com entidades que ainda nao estao salvas no banco de dados. O hibernate fica perdido se deve ou nao gravar tambem aquela entidade (cascatear).

Aqui tem detalhes:

Pelo que eu andei pesquisando o buraco é mais embaixo, e eu não achei uma solução, abaixo esta meu codigo, quem sabe alguém me dá uma luz.

[code]@Entity
@Table(name = “person”)
public class Person {

@Id
@GeneratedValue
private Long id;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id", nullable = true)
private Address address;

@OneToOne(mappedBy="person", cascade = CascadeType.ALL)
private ServiceProvider serviceProvider;

}[/code]

[code]@Entity
@Table(name = “address”)
public class Address {

@Id
@GeneratedValue
private Long id;

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "city_id", nullable = false)
private City city;

@OneToMany(mappedBy = "address", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Person> people;

}[/code]

[code]@Entity
@Table(name = “service_provider”)
public class ServiceProvider {

@Id
@GeneratedValue
private Long id;

@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name="person_id")
private Person person;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "serviceProvider")
@JoinColumn(name="service_provider_id")
private Corporation corporation;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "serviceProvider")
@JoinColumn(name="service_provider_id")
private Individual individual;

@OneToMany(mappedBy = "serviceProvider", cascade = CascadeType.ALL)
private List<Classification> classifications;

@OneToMany(mappedBy = "serviceProvider", cascade = CascadeType.ALL)
private List<ServiceRequest> servicesRequest;

}[/code]

[code]@Entity
@Table(name = “corporation”)
public class Corporation {

@Id
@GeneratedValue(generator = "foreign")
@GenericGenerator(name = "foreign", strategy = "foreign", parameters = { @Parameter(name = "property", value = "serviceProvider") })
@Column(name = "service_provider_id")
private Long serviceProviderId;

@OneToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private ServiceProvider serviceProvider;

}[/code]

Quando você faz mappedBy indica que quem manda na associação é o outro lado… ou seja, assim você não consegue fazer cascade. Você deve alterar isso e decidir quem manda na associação e de que lado para qual lado será o cascade. Cascades não devem ser bidirecionais.

Hummm, mais como indico quem manda na associação?

o lado que nao tem mappedBy é quem manda.

Resumindo, mappedBy fica no lado que tem a forenKey ou o lado que tem a coleção?

Boa tarde, estou com problemas para alterar meus usuáro. Você poderia me da uma luz?
Para meu projeto web estou utilizando VRaptor 3, hibernate e JSP.
Meu UsuarioDao esta assim:
[color]package com.wordpress.wbotelhos.dao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

import com.wordpress.wbotelhos.hibernate.HibernateUtil;
import com.wordpress.wbotelhos.model.Usuario;

/**

@SessionScoped
@Component
public class UsuarioDao implements Serializable {

private static final long serialVersionUID = -1917047398280846082L;

private List<Usuario> usuarioList = new ArrayList<Usuario>();

public void salvar(Usuario usuario) {
	try {
		Session session = new HibernateUtil().getSession();
		Transaction trans = session.beginTransaction();
		session.save(usuario);
        trans.commit();
		session.close();
	}catch(HibernateException he){
		he.printStackTrace();
	}catch (Exception e) {
		e.printStackTrace();
	}
	usuarioList.add(usuario);
}

public void remove(Usuario usuario) {  
	
	try {
		Session session = new HibernateUtil().getSession();
		Transaction trans = session.beginTransaction();
		session.delete(usuario);
		trans.commit();
		session.close();
	}catch(HibernateException he){
		he.printStackTrace();
	}catch (Exception e) {
		e.printStackTrace();
 		}
	usuarioList.remove(usuario);
} 

public List<Usuario> loadAll() {
	Session session = new HibernateUtil().getSession(); 
	usuarioList = session.createCriteria(Usuario.class).list(); 
	return usuarioList;
}

//O método carrega o usuario na tela de novo usuario para o mesmo ser alterado
public Usuario carregarPeloCodigo(Usuario usuario) {
	Session session = new HibernateUtil().getSession(); 
	Usuario user = new Usuario();
	user = (Usuario) session.createCriteria(Usuario.class)
		.add(Restrictions.eq("codigo", usuario.getCodigo()))
		.uniqueResult(); 
	return user;
}

public void alterar(Usuario usuario) {
	try {
		Session session = new HibernateUtil().getSession();
		Transaction trans = session.beginTransaction();
		session.update(usuario);
		trans.commit();
		session.close();
	}catch(HibernateException he){
		he.printStackTrace();
	}catch (Exception e) {
		e.printStackTrace();
	}
}

} [color]

E meu UsuarioController:

[color][color=blue]package com.wordpress.wbotelhos.controller;

import java.util.List;

import br.com.caelum.vraptor.Delete;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Put;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.view.Results;

import com.wordpress.wbotelhos.dao.UsuarioDao;
import com.wordpress.wbotelhos.model.Usuario;

/**

@Resource
public class UsuarioController {

private Result result;
private UsuarioDao usuarioDao;

public UsuarioController(Result result, UsuarioDao usuarioDao) {
	this.result = result;
	this.usuarioDao = usuarioDao;
}

@Get
@Path("/usuario/novo")
public void novo(Usuario usuario) {
	result.include("usuario", usuario);
}    

@Post
@Path("/usuario")
public void salvar(Usuario usuario) {
	usuarioDao.salvar(usuario);
	// Poderia ser resumido com: result.use(Results.logic()).redirectTo(getClass()).listagem();
	result.include("usuarioList", usuarioDao.loadAll());
	result.use(Results.page()).forward("WEB-INF/jsp/usuario/listagem.jsp");
}

@Get
@Path("/usuario")
public List<Usuario> listagem() {
	return usuarioDao.loadAll();
}

@Put
@Path("/usuario")
public void editar(Usuario usuario) {
	Usuario user = usuarioDao.carregarPeloCodigo(usuario);
	usuarioDao.alterar(user);
	result.use(Results.logic()).redirectTo(getClass()).novo(user);
}

@Delete
@Path("/usuario")
public void remove(Usuario usuario) {
	usuarioDao.remove(usuario);
	result.use(Results.logic()).redirectTo(getClass()).listagem();
}

}[/color]

Meu JSP, que seria para gravar usuário mas que utilizo para também alterar esta assim:

[color=blue]<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>

http://wbotelhos.wordpress.com Página Principal
Nome:
Senha:
Login:
Data de Nascimento:
Ativo
[/color]

Quando clico no botão salvar ele salva um novo usuario, mas era só alterar aquele usuário carregado na tela. Tem alguma idéia do que seja?

Obrigado.

Você tem de ter o id do usuario na view. Se o usuário vem sem id ele vai incluir um novo.