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;
}