Problema ao cadastrar um objeto associado a outro objeto

Olá pessoal.

Possuo um usuário que está associado a um endereço e a uma lista de telefones. Consigo salvar normalmente o primeiro usuario relacionado com seu endereço e telefones. Entretanto quando vou incluir um novo usuário, o endereço e a lista de telefones é sobreposta pelos dados do último usuário cadastrado continuando com o mesmo ID. Os dados do objeto usuário continuam intactos e o ID do usuário é incrementado normalmente.

Estou utilizando hibernate para configurar e criar o banco de dados.

As associações estão sendo realizadas assim:

Classe Usuario:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Usuario implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_usuario")
    private Long idUsuario;
    @Column
    @OneToOne(cascade = {CascadeType.ALL})
    private Endereco endereco;
    @Column
    @ManyToMany(cascade = {CascadeType.ALL})
    private Set<Telefone> telefones;

   // get & set
}

Classe Endereco:

@Entity
public class Endereco implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_endereco")
    private Long idEndereco;

   // get & set
}

Classe Telefone:

@Entity
public class Telefone implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_telefone")
    private Long idTelefone;

    @ManyToMany(mappedBy = "telefones", fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private Set<Usuario> usuario;

  //get & set
}

Agradeço toda ajuda.

tenta tirar esses cascades ai…

e posta seu codigo ai, onde vc esta salvando seus objetos,
provavelmente seus objetos telefone e endereco continuam sendo persistentes e associado a um novo objeto usuario…

soudaniel_01

Retirei todos os Cascade e não salvou nehum objeto.

O código que utilizo para salvar é este:

Método salvar ativado pelo botão incluir na página JSP:

 @SuppressWarnings("static-access")
    public String salvar() throws Exception {
        try {
            Set<Telefone> telefones = new HashSet<Telefone>();
            telefones.add(primeiroTelefone);
            telefones.add(segundoTelefone);

            usuario.setLogado(false);
            usuario.setTelefones(telefones);
            usuario.setEndereco(endereco);
            sucesso = persistencia.create(usuario);
                        
            usuario.setEndereco(null);
            usuario.setTelefones(null);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sucesso ? "sucesso" : "falha";
    }

Método salvar na classe GerenciaPersistencia, chamado pelo método salvar:

public static boolean create(Object value) throws Exception {

        try {
            Transaction t = null;
            Session session = HibernateUtil.getSessionFactory().openSession();
            t = session.beginTransaction();

            session.save(value);
            session.getTransaction().commit();
            session.close();

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

Obrigada.

Oi, será que não precisa usar a annotation @JoinColumn ? :roll:

Pois é lilikadias.
Encontrei um exemplo em que utilizava o @JoinColumn, mas o erro persistia, talvez por alguma outra coisa está errada também.
Se você tiver e puder me mostrar algum exemplo de associação eu agradeço muito.
Hoje a noite irei postar a forma que estou fazendo utilizando o @JoinColumn.

Obrigada e até breve.

Forma utilizando @JoinColumm

Classe Usuario

@Entity
public class Usuario implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_usuario")
    private Long idUsuario;
    @OneToMany(mappedBy = "usuario", fetch = FetchType.LAZY)
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Collection<Telefone> telefones;

    // get & set
}

Classe Telefone

@Entity
public class Telefone implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id_telefone")
    private Long idTelefone;
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_usuario", insertable = true, updatable = true)
    @Fetch(org.hibernate.annotations.FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private Usuario usuario;

    // get & set
}

Aguardo a ajuda de vocês…

Segue um exemplo pra ver se te ajuda:

@Entity
public class Customer implements java.io.Serializable {
	
	//...
	private Collection<Phone> phoneNumbers = new ArrayList<Phone>();
	//...
	@OneToMany(cascade={CascadeType.ALL})
	@JoinColumn(name="CUSTOMER_ID")
	public Collection<Phone> getPhoneNumbers(){
		return phoneNumbers;
	}
	public void setPhoneNumbers(Collection<Phone> phones){
		this.phoneNumbers = phones;
	}
}
@Entity
public class Phone implements java.io.Serializable {

	private int id;
	private String number;
	private int type;
	
	//construtor padrão
	public Phone(){
		
	}
	
	public Phone (String number, int type){
		this.number = number;
		this.type = type;
	}
	
	@Id @GeneratedValue
	public int getId() { return id;}
	public void setId() { this.id = id;}
	
	//gets e sets
}

Esse exemplo é de um relacionamento unidirecional, a classe Phone não fornece uma propriedade de relacionamento para o Customer. Por isso tb, não usei o mappedBy(), que é usado em relacionamentos bidirecionais.

Testei esse exemplo aqui e funcionou… espero que te ajude.

Obrigada lilikadias.

Irei testar assim que possível, provavelmente a noite.

Até.

lilikadias
Tentei utilizar as classes que você passou mas o erro persiste…

:cry:

Com a ajuda de um colega consegui chegar à configuração correta das anotações para um relacionamento 1-N
Classe Usuario

public class Usuario implements java.io.Serializable {
 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "usuario")
    private Set&lt;Telefone&gt; telefones;
    public Set&lt;Telefone&gt; getTelefones() {
        return this.telefones;
    }
}

Classe Telefone

public class Usuario implements java.io.Serializable {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_USUARIO")
    private Usuario usuario;
}

Mas o meu problema continua… consegui capturar as instruções sql geradas:

Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into Endereco (bairro, cep, cidade, complemento, estado, nm_logradouro, numero, pais, id_endereco) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into usuario (ativo, cpf, dt_nascimento, descricao, endereco_id_endereco, estado_civil, logado, login, nm_usuario, profissao, senha, sexo, id_usuario) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into telefone (cod_telefone, num_telefone, tipo_telefone, ID_USUARIO, id_telefone) values (?, ?, ?, ?, ?)
Hibernate: insert into telefone (cod_telefone, num_telefone, tipo_telefone, ID_USUARIO, id_telefone) values (?, ?, ?, ?, ?)
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into usuario (ativo, cpf, dt_nascimento, descricao, endereco_id_endereco, estado_civil, logado, login, nm_usuario, profissao, senha, sexo, id_usuario) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: update Endereco set bairro=?, cep=?, cidade=?, complemento=?, estado=?, nm_logradouro=?, numero=?, pais=? where id_endereco=?
Hibernate: update telefone set cod_telefone=?, num_telefone=?, tipo_telefone=?, ID_USUARIO=? where id_telefone=?
Hibernate: update telefone set cod_telefone=?, num_telefone=?, tipo_telefone=?, ID_USUARIO=? where id_telefone=?

Ou seja no primeiro registro está sendo inserido o usuario e o telefone, entretanto no segundo o registro do telefone é apenas “atualizado”, pegando, então os novos valores.

Continuo no aguardo…