Um Problema com @OneToOne Hibernate

Fala Galera,

estou com um grande problema em minha aplicação e estou com uma grande dificuldade de conseguir ver o problema e tentar resolver, vou postar a parte problemática e explicar o problema abaixo:

Cliente.class

@Entity
@Table(name="cf_clientes")
public class Cliente implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id_clientes")
    private Integer idClientes;

    @OneToMany(cascade=CascadeType.ALL)
    @JoinTable(
        name="cf_clientes_has_endereco",
            joinColumns = { @JoinColumn(name = "id_clientes") },
            inverseJoinColumns = { @JoinColumn(name = "id_enderecoclientes") }
    )
    private Set<EnderecoClientes> enderecoClientes;

    //getters e setters

}
EnderecoClientes.class

@Entity
@Table(name="cf_enderecoclientes", schema="cf")
public class EnderecoClientes implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id_enderecoclientes")
    private Integer idEnderecoClientes;

    @OneToOne(fetch=FetchType.EAGER)
    @Cascade(CascadeType.ALL)
    @JoinColumn(name="id_setor")
    private Setor setor;

    //getters e setters

}

no formulário de cadastro de clientes tenho a opção de adicionar vários endereços, como se pode ver os endereços contem um setor, ai é que está o problema, quando tento cadastrar 2 endereços diferentes para o mesmo setor recebo a mensagem abaixo:

como posso fazer para resolver esse problema?
estou batendo um pouco de cabeça aqui.

Att,

Já que um setor pode ser cadastrado para mais de 1 endereço, o mapeamento deve ser @ManyToOne

Isto está ocorrendo quando provavelmente está dando um update no seu objeto, certo?

Post o código que está lançando a exceção (save ou update)

Detalhe, você deve estar selecionando o setor (em um combo algo do tipo), creio que não é necessário a anotação cascade para all.

Abraço

    public void alterar(Cliente cliente) throws HibernateException {
        try {
            sessao.beginTransaction();
            sessao.update(cliente);
            sessao.getTransaction().commit();
        }catch (HibernateException e) {
            sessao.getTransaction().rollback();
            throw new HibernateException (e.getMessage());
        }
    }

esse é o metodo do ClienteDao que faz o update.

estou fazendo como me orientaram a primeira vez criei uma tabela de relacionamento entre os clientes e endereços, porem podem haver endereços diferentes de um mesmo setor.

fiz o teste com @ManyToOne e deu o mesmo problema.

fala galera consegui, obrigado pela ajuda.

narciso.benigno, realmente nãp precisava do cascade para all.
existe algum lugar que posso buscar as diferenças entre os tipos e em qual situação usar?

att,

[quote=thiago.fernandes]fala galera consegui, obrigado pela ajuda.

narciso.benigno, realmente nãp precisava do cascade para all.
existe algum lugar que posso buscar as diferenças entre os tipos e em qual situação usar?

att,[/quote]

Eu não sei se entendi sua pergunta, mas se você está querendo encontrar os endereços com com algum tipo de setor você terá que escrever uma hql do tipo “from EnderecoClientes as ec where ec.setor.id = :id”, é esta sua duvida?

Abraço

eu estava tentando fazer um update, porem o sistema lançava uma exception no mapeamento de setores, dizendo que já existia um objeto identido na memória, mas consegui resoler removendo o cascade.all