Bom, acho que o negócio não deu certo, modifiquei minha classe, e está fazendo o update no usuário, mas se eu não colocar o campo do endereço, ele seta o endereço como nulo…
Vou postar as novas classes que fiz…
Usuario DAO…
package br.com.rhfactor.quimiflex.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.vraptor.ioc.Component;
import br.com.rhfactor.quimiflex.entidades.Endereco;
import br.com.rhfactor.quimiflex.entidades.Usuario;
@Component
public class UsuarioDao {
private final Session session;
public UsuarioDao(Session session) {
this.session = session;
}
public void add(Usuario usuario, Endereco endereco) {
Transaction tx = session.beginTransaction();
session.save(endereco);
usuario.setEndereco(endereco);
session.save(usuario);
tx.commit();
}
public void add(Usuario usuario) {
Transaction tx = session.beginTransaction();
session.save(usuario);
tx.commit();
}
public void edit(Usuario u) {
Transaction tx = session.beginTransaction();
System.out.println("Editar " + u.getId());
session.update(u);
tx.commit();
}
public void edit(Usuario u, Endereco e) {
Transaction tx = session.beginTransaction();
session.update(e);
session.update(u);
tx.commit();
}
@SuppressWarnings("unchecked")
public List<Usuario> listar() {
return this.session.createCriteria(Usuario.class).list();
}
public Usuario buscar(Long id) {
return (Usuario) session.load(Usuario.class, id);
}
}
Usuario
package br.com.rhfactor.quimiflex.entidades;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Usuario {
@Id
@GeneratedValue
private Long id;
private String nome;
@OneToOne()
private Endereco endereco;
// Metodos
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Endereco getEndereco() {
return endereco;
}
public void setEndereco(Endereco endereco) {
this.endereco = endereco;
}
}
Endereco
package br.com.rhfactor.quimiflex.dao;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import br.com.caelum.vraptor.ioc.Component;
import br.com.rhfactor.quimiflex.entidades.Endereco;
@Component
public class EnderecosDao {
private final Session session;
public EnderecosDao(Session session) {
this.session = session;
}
public void add(Endereco endereco) {
Transaction tx = session.beginTransaction();
session.save(endereco);
tx.commit();
}
@SuppressWarnings("unchecked")
public List<Endereco> listar() {
return this.session.createCriteria(Endereco.class).list();
}
}
Formulario de Edição, quero alterar somente o nome
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Editar Usuario</title>
</head>
<body>
<form method="post" action="<c:url value="/usuario/editar/${usuario.id}" />">
<input type="hidden" name="_method" value="PUT"/>
<input type="text" name="usuario.id" value="${usuario.id}" /><br/>
Nome:<input type="text" name="usuario.nome" value="${usuario.nome}" /><br/>
<input type="submit" value="cadastrar" />
</form>
</body>
</html>
Por fim, o controller do Usuario
package br.com.rhfactor.quimiflex.controller;
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.rhfactor.quimiflex.dao.UsuarioDao;
import br.com.rhfactor.quimiflex.entidades.Usuario;
@Resource
public class UsuarioController {
private Result result;
private UsuarioDao dao;
public UsuarioController(Result result, UsuarioDao dao) {
this.result = result;
this.dao = dao;
}
public void index(){
}
public void formulario(){
}
@Post
@Path("/usuario/adicionar")
public void adicionar(final Usuario usuario){
dao.add(usuario,usuario.getEndereco());
result.forwardTo(UsuarioController.class).listar();
}
public void listar(){
result.include("usuario",dao.listar());
}
@Get
@Path("usuario/editar/{id}")
public Usuario editar(Long id){
Usuario usuario = dao.buscar(id);
return usuario;
}
@Put
@Path("/usuario/editar/{id}")
public void edita(Usuario usuario){
dao.edit(usuario);
result.forwardTo(UsuarioController.class).listar();
}
}
Por fim, mesmo que eu usasse, como sugerido pelo Daniel…
@Put
@Path("/usuario/editar/{id}")
public void edita(Usuario usuario){
Usuario usuarioDB = dao.buscar(usuario.getId());
usuarioDB.setNome(usuario.getNome());
dao.edit(usuarioDB);
result.forwardTo(UsuarioController.class).listar();
}
dessa mesma maneira ele perde a referencia dos campos que não estão no formulário, setando como null… ou seja, se eu quisesse um formulário apenas com senha, ele deixaria todos os outros campos como null.