2
respostas

Atualizar o banco de dados pelo Spring

Estou fazendo um projeto usando a lógica do curso de Spring mvc (aplicando o que aprendi). Estou tendo um problema de atualizar os danos no banco de dados. Meu controller

@Controller
@RequestMapping("/transacao")
public class TransacaoController {

    @Autowired
    private ClienteDAO clienteDAO;

    @RequestMapping(method = RequestMethod.GET, value = "/deposita/{id}")
    public ModelAndView form(@PathVariable("id") int id) {
        ModelAndView modelAndView = new ModelAndView("transacao/transacao");

        Cliente cliente = clienteDAO.find(id);
        modelAndView.addObject("cliente", cliente);
        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST, value = "/deposita/{id}")
    public ModelAndView deposita(@PathVariable("id") int id, Cliente cliente) {
        ModelAndView modelAndView = new ModelAndView("redirect:/");

        //Cliente cliente = clienteDAO.find(id);
        clienteDAO.atualiza(cliente);
        modelAndView.addObject("cliente", cliente);
        return modelAndView;
    }
}

Dao

@Repository
@Transactional
public class ClienteDAO {

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Cliente cliente) {
        manager.persist(cliente);
    }
    public void atualiza(Cliente cliente) {
        manager.merge(cliente);
    }

    public Cliente getProduto(Integer id) {
        Cliente cliente = manager.find(Cliente.class, id);
        return cliente;
    }
    public List<Cliente> listar() {
        return manager.createQuery("select c from Cliente c", Cliente.class)
                .getResultList();
    }

    public Cliente find(int id) {
        return manager.find(Cliente.class, id);
    }
}

JSP

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form:form action="${s:mvcUrl('TC#deposita').arg(0,cliente.id).build() }" method="post"
        modelAttribute="cliente">
        <div>
        <input type="number" name="conta.deposita" />        
        <button type="submit">Depositar</button>
        </div>
    </form:form>
</body>
</html>

Eu quero fazer um deposito na conta com Id "x". O controller me envia para o jsp que devolve o valor do deposito para ser atualizado no banco de dados. Essa foi a lógica que usei, mas acho que errei em algo, estava dando o erro

detached entity passed to persist

mexi em algumas coisas e não ocorre mais, mas também não acontece nada.

2 respostas

Como está sua classe Cliente?

Anote o relacionamento com CascadeType.MERGE, deve resolver.

Pior que não, ficou até pior kkk Agora toda vez que "deposito" cria uma nova conta com tudo null. O projeto esta no git, se puder dar uma olhada rapida, é pequeno https://github.com/BryanMotta/FormacaoJava