Pessoal, estou encontrando o seguinte problema na hora de fazer um certo cadastro:
HTTP Status 500 - javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.arena.model.Pessoa
Meu objetivo e realizar o cadastro de um Time, esse time fica associado a uma Pessoa através de uma associativa Pessoa_Time
Pessoa Model:
@Entity
public class Pessoa implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "id_Pessoa")
private Integer id;
@Column(nullable = false, unique = true)
private String nomeUsuario;
@Column(nullable = false, unique = true)
private String senhaUsuario;
@Column(nullable = false, unique = true)
private String nomeCompleto;
@Column(nullable = false, unique = true)
private String email;
@Column(nullable = false, unique = true)
private Integer idade;
@OneToMany(mappedBy = "pessoa", cascade = CascadeType.ALL)
private List<PessoaTime> listaPessoaTime;
public Pessoa (){}
public Pessoa (Pessoa pessoa){
this.id = pessoa.getId();
this.nomeUsuario = pessoa.getNomeUsuario();
this.senhaUsuario = pessoa.getSenhaUsuario();
this.nomeCompleto = pessoa.getNomeCompleto();
this.email = pessoa.getEmail();
this.idade = pessoa.getIdade();
}
Time Model:
@Entity
public class Time implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name = "id_Time")
private int id;
@Column(nullable = false)
private String nome;
@Column(nullable = false)
private String senhaTime;
@OneToMany(mappedBy = "time",cascade = CascadeType.ALL)
private List<PessoaTime> listaPessoaTime;
@OneToMany(mappedBy="time",cascade = CascadeType.ALL)
private List<CampeonatoTime> listaCampeonatoTime;
public Time(){}
public Time(Time time){
this.id = time.getId();
this.nome = time.getNome();
this.senhaTime = time.getSenhaTime();
}
Pessoa_Time Model:
@Entity
@Table(name="pessoa_time")
public class PessoaTime implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column (name="id_PessoaTime")
private Integer id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="id_pessoa")
private Pessoa pessoa;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="id_time")
private Time time;
private Cargo cargo;
public PessoaTime (){}
public PessoaTime (PessoaTime pessoaTime){
this.id = pessoaTime.getId();
this.pessoa = pessoaTime.getPessoa();
this.time = pessoaTime.getTime();
this.cargo = pessoaTime.getCargo();
}
PessoaDAO:
public class PessoaDAO {
private EntityManager em;
public PessoaDAO() {
setEm(JPAUtil.getEntityManager());
}
public void cadastrar(Pessoa pessoa){
getEm().getTransaction().begin();
getEm().persist(pessoa);
getEm().getTransaction().commit();
}
TimeDAO:
public class TimeDAO {
private EntityManager em;
public TimeDAO() {
setEm(JPAUtil.getEntityManager());
}
public void cadastrar(Time time){
getEm().getTransaction().begin();
getEm().persist(time);
getEm().getTransaction().commit();
}
PessoaTimeDAO:
public class PessoaTimeDAO {
private EntityManager entityManager;
public PessoaTimeDAO() {
setEntityManager(JPAUtil.getEntityManager());
}
public void cadastrar(PessoaTime pessoaTime){
getEntityManager().getTransaction().begin();
getEntityManager().persist(pessoaTime);
getEntityManager().getTransaction().commit();
}
PessoaBean:
@ManagedBean(name = "pessoaMB")
@SessionScoped
public class PessoaBean implements Serializable{
private static final long serialVersionUID = 1L;
private Pessoa pessoa = new Pessoa();
private PessoaDAO dao = new PessoaDAO();
public PessoaBean(){}
public Pessoa usuarioLogado(){
FacesContext context = FacesContext.getCurrentInstance() ;
Pessoa usuarioLogado = (Pessoa) context.getExternalContext() .getSessionMap().get("usuarioLogado");
Integer id = usuarioLogado.getId();
Pessoa p = getDao().pessoaLogada(usuarioLogado);
return p;
}
public String cadastrar() {
getDao().cadastrar(getPessoa());
limpaTela();
return "login.xhtml";
}
TimeBean:
@ManagedBean(name = "TimeMB")
@SessionScoped
public class TimeBean implements Serializable{
private static final long serialVersionUID = 1L;
private Time time = new Time();
private TimeDAO dao = new TimeDAO();
private Pessoa pessoa = new Pessoa();
private PessoaDAO pessoaDao = new PessoaDAO();
public TimeBean(){}
public Pessoa usuarioLogado(){
Pessoa p = null;
FacesContext context = FacesContext.getCurrentInstance() ;
Pessoa usuarioLogado = (Pessoa) context.getExternalContext() .getSessionMap().get("usuarioLogado");
if(usuarioLogado != null){
p = getPessoaDao().pessoaLogada(usuarioLogado);
}
return p;
}
public void cadastrar() {
getDao().cadastrar(getTime());
PessoaTime pessoaTime = getPessoaTime(usuarioLogado(), getTime());
PessoaTimeDAO pessoaTimeDAO = new PessoaTimeDAO();
pessoaTimeDAO.cadastrar(pessoaTime);
limpaTela();
}
public PessoaTime getPessoaTime(Pessoa pessoa, Time time){
PessoaTime p = new PessoaTime();
p.setPessoa(pessoa);
p.setTime(time);
return p;
}
Por fim, o meu cadastrarTime.xhtml:
<h:form class="form-label" id="cadastrarTime">
<div class="form-group row">
<label for="thread" class="col-md-2">Nome do Time:</label>
<div class="col-md-10">
<h:inputText value="#{TimeMB.time.nome}" type="nome" class="form-control" id="nome" placeholder="Adicione um nome ao seu time"/>
</div>
</div>
<div class="form-group row">
<label for="description" class="col-md-2">Senha do Time:</label>
<div class="col-md-10">
<h:inputSecret value="#{TimeMB.time.senhaTime}" type="password" class="form-control" id="senha" placeholder="Senha do seu Time"/>
</div>
</div>
<!-- <div class="form-group row">
<label class="col-md-2">Descrição do Time</label>
<div class="col-md-10">
<div class="forum-post no-margin no-shadow">
<div class="text-editor"></div>
</div>
</div>
</div> -->
<div class="text-center">
<h:commandButton action="#{TimeMB.cadastrar()}" value="Cadastrar" class="btn btn-primary btn-lg btn-rounded btn-shadow"/>
</div>
</h:form>