Detached exception in associative table

4

I'm finding the following problem when making a certain registration:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.arena.model.Pessoa
        at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
        at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
        at br.com.arena.dao.PessoaTimeDAO.cadastrar(PessoaTimeDAO.java:18)
        at br.com.arena.util.Persistir.main(Persistir.java:54)
    Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: br.com.arena.model.Pessoa
        at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:102)
        at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:636)
        at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:628)
        at org.hibernate.engine.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:28)
        ... 18 more

My goal is to register a Team, this team is associated with a Person through an associative table Person_Time

Person 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();
    }

PersonaTime 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();
    }

PersonaDAO:

    public void cadastrar(Pessoa pessoa){
        getEm().getTransaction().begin();
        getEm().persist(pessoa);
        getEm().getTransaction().commit();
    }

TimeDAO:

    public void cadastrar(Time time){
        getEm().getTransaction().begin();
        getEm().persist(time);
        getEm().getTransaction().commit();
    }

PersonTimeDAO:

    public void cadastrar(PessoaTime pessoaTime){
        getEntityManager().getTransaction().begin();
        getEntityManager().persist(pessoaTime);
        getEntityManager().getTransaction().commit();
    }

Persisting.java: Main Class

public static void main(String[] args) {

        Time time = new Time();
        TimeDAO timedao = new TimeDAO();
        PessoaTime pessoatime = new PessoaTime();
        PessoaTimeDAO pessoatimedao = new PessoaTimeDAO();

        time.setNome("Time novo");
        time.setSenhaTime("4");

        timedao.cadastrar(time);        

        PessoaDAO pessoaDAO = new PessoaDAO();

        Pessoa pessoa = new Pessoa();
        pessoa.setNomeUsuario("pessoa 2");
        pessoa.setSenhaUsuario("1234567892");
        pessoa.setNomeCompleto("pessoa people 2");
        pessoa.setEmail("[email protected]");
        pessoa.setIdade(22);

        pessoaDAO.cadastrar(pessoa);

        pessoatime.setPessoa(pessoa);
        pessoatime.setTime(time);
        pessoatime.setCargo(Cargo.ADMINISTRADOR);

        pessoatimedao.cadastrar(pessoatime);
}
    
asked by anonymous 15.07.2016 / 17:55

1 answer

2

Solved!

The error was in the CascadeType of the attributes:

Person:

@OneToMany(mappedBy = "pessoa", cascade = CascadeType.DETACH)
    private List<PessoaTime> listaPessoaTime;

Time:

@OneToMany(mappedBy = "time",cascade = CascadeType.DETACH)
    private List<PessoaTime> listaPessoaTime;

PersonaTime:

  @ManyToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name="id_pessoa")
    private Pessoa pessoa;

    @ManyToOne(cascade = CascadeType.DETACH)
    @JoinColumn(name="id_time")
    private Time time;
    
15.07.2016 / 19:04