Perda de dados na hora de salvar Entity

4 respostas
shadowzaum

Opa…

Bom, estou com um problema mais sério aqui que já estou quebrando cabeça a uns dois dias e não consigo arrumar.

Tenho uma entidade Tarefa no meu projeto, que agora tenho que fazer uma ligação com outra entidade que é a de Chamado e outra de usuario. Até ai tudo certo, adicionei as colunas para os ID’s no banco e tudo certo. Dai na entidade tarefa eu deixei assim

@ManyToOne
	@JoinColumn( name = "id_chamado" )
	private Chamado chamado;

	@ManyToOne
	@JoinColumn( name = "id_usuario" )
	private Usuario usuario;

Beleza, quando crio uma Tarefa a partir de um Chamado, ele salva o ID do chamado lá, tudo certo.
Quando um Usuario marca que vai fazer a tarefa, também aparece tudo certo.

Porem quando vou editar uma tarefa que contem esses dados, na hora de eu salvar, ele desaparece com o Usuario e o Chamado.
O ManagedBean está com escopo Request e na pagina eu tenho tudo em inputHidden, como mostrado a baixo.

<h:inputHidden value="#{tarefaController.tarefa.id}"/>
<h:inputHidden value="#{tarefaController.tarefa.usuario.id}" rendered="#{tarefaController.tarefa.usuario ne null}" />
<h:inputHidden value="#{tarefaController.tarefa.chamado.id}" rendered="#{tarefaController.tarefa.chamado ne null}"/>
<h:inputHidden value="#{tarefaController.tarefa.dataAbertura}">
    <f:convertDateTime pattern="dd/MM/yyyy HH:mm:ss" type="both" timeZone="America/Sao_Paulo" />
</h:inputHidden>

Bom, acho que isso. Qualquer informação adicional, só pedir que posto.

Obrigado.

4 Respostas

D

posta ai o persistence.xml

shadowzaum

Nem tem nada demais. Lembrando que tenho outras entidades que fazem a mesma coisa e elas mantem os dados, essa é a unica que ta dando problema.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="VirtualTtrackerPU" transaction-type="JTA">
    <jta-data-source>jdbc/virtualtracker</jta-data-source>
    <shared-cache-mode>NONE</shared-cache-mode>
    <properties>
	    <property name="toplink.logging.level" value="FINE"/>
    </properties>
  </persistence-unit>
</persistence>
D

Posta a implementação dessa manipulação de editar e salvar

shadowzaum

TarefaController.java

@ManagedBean(name = "tarefaController")
public class TarefaController extends BaseController {

	@EJB
	private TarefaService tarefaService;

	private List<Tarefa> tarefas;
	private Tarefa tarefa = new Tarefa();

	@ManagedProperty("#{loginController.usuario}")
	private Usuario usuario;
	
	@ManagedProperty("#{chamadoController.chamado}")
	private Chamado chamado;

	public void delete() {
		tarefaService.deleteTarefa(tarefaSelected);
		super.addMessage(FacesMessage.SEVERITY_INFO, "action.delete.success");
	}
	
	public void save() {
		if (tarefa.getId() == null) {
			this.tarefa = tarefaService.insertTarefa(tarefa);
			super.addMessage(FacesMessage.SEVERITY_INFO,
					"action.insert.success");
		} else {
			this.tarefa = tarefaService.updateTarefa(tarefa);
			super.addMessage(FacesMessage.SEVERITY_INFO,
					"action.update.success");
		}
	}

	public void saveFromChamado() {
		this.tarefa.setChamado(this.chamado);
		this.tarefa.setProjeto(this.chamado.getProjeto());
		this.tarefa.setDataAbertura(new Date());
		this.tarefa.setStatus(StatusType.ABERTO);

		this.tarefa = tarefaService.insertTarefa(tarefa);
	}
	
	/**
	 * Função que atribui o usuario logado ao atributo Atendente da Tarefa
	 */
	public void atender() {
		this.tarefa.setUsuario(this.usuario);
		this.tarefa.setStatus(StatusType.EM_ANDAMENTO);
		this.tarefa.setDataInicio(new Date());
		this.tarefa = tarefaService.updateTarefa(tarefa);
		super.addMessage(FacesMessage.SEVERITY_INFO, "action.task.answer.success");
	}

//Getter and setter 
}

TarefaService.java

package br.com.voffice.vtracker.service;

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

import javax.ejb.Stateless;
import javax.mail.internet.MimeMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import br.com.voffice.vtracker.entity.Chamado;
import br.com.voffice.vtracker.entity.Mensagem;
import br.com.voffice.vtracker.entity.Projeto;
import br.com.voffice.vtracker.entity.Tarefa;
import br.com.voffice.vtracker.exception.BusinessException;
import br.com.voffice.vtracker.types.StatusType;

/**
 * 
 * Descrição da Classe: 
 * 
 * Classe responsavel por implementar os serviços de negócio da entidade Tarefa.
 * 
 * @author Renato Müller Rosa
 */

@Stateless
public class TarefaService implements Serializable {
	
	@PersistenceContext
	EntityManager em;
	
	public void deleteTarefa(Integer idTarefa) {
		Tarefa t = em.find(Tarefa.class, idTarefa);
		em.remove(t);
		em.flush();
	}
	
	public Tarefa find(Integer idTarefa) {
		return em.find(Tarefa.class, idTarefa);
	}

	public Tarefa insertTarefa(Tarefa t) {
		em.persist(t);
		em.flush();
		return t;
	}
	
	public Tarefa updateTarefa(Tarefa t) {
		em.merge(t);
		return t;
	}

}

É isso ai, tudo que envolve na hora de salvar. E a entidade completa seria isso aqui

Tarefa.java

public class Tarefa implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;
	private String nome;
	private TaskType tipo;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_abertura")
	private Date dataAbertura;
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_conclusao")
	private Date dataConclusao;
	private String descricao;
	@Column(name = "horas_estimadas")
	private Integer horasEstimadas;
	@Column(name = "horas_realizadas")
	private Integer horasRealizadas;
	@Enumerated(EnumType.ORDINAL)
	private StatusType status;
	@Enumerated(EnumType.STRING)
	private PriorityType prioridade;
	private boolean backlog;
	
	@Column(name = "versao_projeto")
	private String versaoProjeto;

	@ManyToOne 
	@JoinColumn( name="id_projeto" )
	private Projeto projeto;
	
	@ManyToOne
	@JoinColumn( name = "id_chamado" )
	private Chamado chamado;

	@ManyToOne
	@JoinColumn( name = "id_usuario" )
	private Usuario usuario;
	
	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "data_inicio")
	private Date dataInicio;

	public Tarefa() {
		super();
	}

//Getters and Setters
}
Criado 24 de agosto de 2012
Ultima resposta 24 de ago. de 2012
Respostas 4
Participantes 2