Erro ao tentar Atualizar os dados

2 respostas
F

Bom dia a todos, venho mais uma vez tentar resolver um problema q já estou há dias tentando solucionar, já tentei de tudo, o erro só acontece quando vou editar um registro, quando é um novo, tudo acontece normalmente; uso o Hibernate, Spring e JSF.

erro:

javax.servlet.ServletException: #{profissionalController.salvar}: java.lang.IllegalArgumentException: attempt to create merge event with null entity

meus beans:

@Entity
@Table(name = "pessoa")
public class Pessoa implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private String codigo;
	private String cpfcnpj;
	private Profissional profissional;

	public Pessoa() {
	}

	@Id
	@Column(name = "codigo", unique = true, nullable = false)
	public String getCodigo() {
		return this.codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	@Column(name = "cpfcnpj")
	public String getCpfcnpj() {
		return this.cpfcnpj;
	}

	public void setCpfcnpj(String cpfcnpj) {
		this.cpfcnpj = cpfcnpj;
	}

	@OneToOne(fetch = FetchType.LAZY, mappedBy = "pessoa")
	public Profissional getProfissional() {
		return this.profissional;
	}

	public void setProfissional(Profissional profissional) {
		this.profissional = profissional;
	}
@Entity
@Table(name = "profissional")
public class Profissional implements java.io.Serializable {

	private static final long serialVersionUID = 1L;
	private String codigo;
	private Tiposanguineo tiposanguineo;
	private Fatorrh fatorrh;
	private Sexo sexo;
	private Pessoa pessoa;

	public Profissional() {

	}

	@GenericGenerator(name = "generator", strategy = "foreign", parameters = @Parameter(name = "property", value = "pessoa"))
	@Id
	@GeneratedValue(generator = "generator")
	@Column(name = "codigo", unique = true, nullable = false, length = 14)
	public String getCodigo() {
		return this.codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idtiposanguineo", nullable = false)
	public Tiposanguineo getTiposanguineo() {
		return this.tiposanguineo;
	}

	public void setTiposanguineo(Tiposanguineo tiposanguineo) {
		this.tiposanguineo = tiposanguineo;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idfatorrh", nullable = false)
	public Fatorrh getFatorrh() {
		return this.fatorrh;
	}

	public void setFatorrh(Fatorrh fatorrh) {
		this.fatorrh = fatorrh;
	}

	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idsexo", nullable = false)
	public Sexo getSexo() {
		return this.sexo;
	}

	public void setSexo(Sexo sexo) {
		this.sexo = sexo;
	}

	@OneToOne(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
	@PrimaryKeyJoinColumn
	public Pessoa getPessoa() {
		return this.pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

meu controller:

@Controller("profissionalController")
@Scope("session")
public class ProfissionalController {

private Profissional profissional;
private Pessoa pessoa;
.
.
.
public String salvar() {
	if (profissional.getCodigo() == null) {
		pessoaDao.salvar(pessoa);
		profissionalDao.salvar(profissional);
		FacesUtils.mensInfo("Cadastrado com sucesso");
	} else {
		profissionalDao.atualizar(profissional);
		pessoaDao.atualizar(pessoa);
		FacesUtils.mensInfo("Atualizado com sucesso");
	}


public String editar() {
	FacesContext context = FacesContext.getCurrentInstance();  
	Profissional profissional = (Profissional) context.getExternalContext().getRequestMap().get("item");
	setProfissional(profissional);
	return "formProfissional";
	}

métodos do Dao:

@Override
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public T salvar(T object) {
	getEntityManager().clear();
	getEntityManager().persist(object);
	return object;
}

@Override
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
public T atualizar(T object) {
	getEntityManager().merge(object);
	return object;
}

2 Respostas

F

Pelo que eu entendi, você gostaria de salvar as alterações de uma instância da classe Pessoa, mas o parâmetro object é null na linha de código abaixo:

getEntityManager().merge(object);

Dentro do método atualizar.

F

Antes de mais nada, obrigado pela ajuda, estou quase no desespero.

Acredito que sim, quando tiro a linha

pessoaDao.atualizar(pessoa)

a atualização acontece sem problemas, nos campos referentes a profissional, mas é claro, o campo cpfcnpj de pessoa, não é atualizado caso seja feita alguma modificação.

acredito q o erro possa ser no editar, mas já tentei fazer a mesmo coisa q faço pra profissional, ou seja, pegar o contexto e setar uma Pessoa:

public String editar() {   
    FacesContext context = FacesContext.getCurrentInstance();     
    Profissional profissional = (Profissional) context.getExternalContext().getRequestMap().get("item");   
    Pessoa pessoa = (Pessoa) context.getExternalContext().getRequestMap().get(profissional.getCodigo());   
    setPessoa(pessoa);
    setProfissional(profissional);   
    return "formProfissional";   
    }

mas dá outro erro.

Criado 12 de abril de 2010
Ultima resposta 12 de abr. de 2010
Respostas 2
Participantes 2