Problema na inserçao de dados com hibernate

Por favor estou com problema com hibernate com o mapeamento sou novo no mapeamento com hibernate ja tentei de tudo segue abaixo os mapeamentos
Segue abaixo as Classes mapeadas, o crud para inserção dos dados, e as tabelas estado e cidade com os dados duplicados.
não sei o que fazer para que toda vez que inserir uma cidade não inseri um estado duplicado se alguem puder me ajudar agradeço muito.

import java.io.Serializable;

import java.util.List;
import javax.persistence.*;
import javax.persistence.ManyToOne;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.ForeignKey;

/**
*

  • @author paulo
    */
    @Entity()
    @Table(name=“cidade”)
    public class Cidade implements Serializable{
    @Id
    @GeneratedValue
    @Column()
    private Integer cidadeid;
    @Column()
    private String nome;
    @ManyToOne(targetEntity=Estado.class,optional=true,fetch= FetchType.EAGER)
    @JoinColumn(name=“estadoid”,insertable=true,updatable=true,referencedColumnName=“estadoid”,nullable=true)
    @Fetch(FetchMode.JOIN)

private Estado estado;

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Modelo;

import java.util.List;
import java.io.Serializable;
import java.util.Collection;
import java.util.Set;
import javax.persistence.*;
import javax.persistence.GeneratedValue;

/**
*

  • @author paulo
    */
    @Entity
    @Table(name=“estado”)
    public class Estado implements Serializable{
    @Id
    @GeneratedValue
    @Column(insertable=true,updatable=false)

    private Integer estadoid;
    @Column()
    private String uf;
    @OneToMany(mappedBy=“estado”,cascade={ CascadeType.ALL},fetch= FetchType.EAGER)

private Collection cidade;

}

Cidade cidade = new Cidade();
Estado estado = new Estado();

estado.setUf(combouf.getSelectedItem().toString());
cidade.setNome(txtNome.getText());
cidade.setEstado(estado);
estado.setCidade(new HashSet());

estado.getCidade().add(cidade);
DaoEstado da = new DaoEstado();
da.Inserir(estado);

PreencherCampos();

estadoid uf
1 AC
2 AC

cidadeid nome estadoid
1 fffffffffffffff 1
2 eeeeeeeeeeeeee 2
NULL NULL NULL