OneToMany Bidirecional + Cascade, salvar automaticamente a lista dependente

E ai galera, to com uma dúvida referente a questão do OneToMany… Ja pesquisei em varios lugares e não achei nenhuma resposta…

Classe Cliente

@Entity
public class Cliente extends Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Column(name = "rg", length = 20)
    private String rg;
    @Enumerated(EnumType.STRING)
    private SexoEnum sexo;
    @Column(name = "limiteCredito")
    private Double limiteCredito;
    @ManyToOne
    @JoinColumn(name = "codigo_banco")
    private Banco banco;
    @Column(name = "nome_conta", length = 60)
    private String nomeConta;
    @Column(name = "numero_conta", length = 10)
    private String numeroConta;
    @Column(name = "numero_agencia", length = 10)
    private String numeroAgencia;
    @Column(name = "digito_agencia", length = 5)
    private String digitoAgencia;
    @Column(name = "digito_conta", length = 5)
    private String digitoConta;
   ....
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Pessoa implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo_pessoa;
    @Column(name = "nome_razao", length = 100)
    private String nomeRazao;
    @Column(name = "nome_fantasia", length = 100)
    private String nomeFantasia;
    @Column(name = "cpf_cnpj", length = 20)
    private String cpfCnpj;
    @Enumerated(EnumType.STRING)
    private TipoPessoaEnum tipoPessoa;
    @Column(name = "inscricao_estadual", length = 20)
    private String inscricaoEstadual;
    @Column(name = "inscricao_municipal", length = 20)
    private String inscricaoMunicipal;
    @Lob
    @Type(type = "org.hibernate.type.TextType")
    @Column(name = "observacoes")
    private String observacoes;
    @Enumerated(EnumType.STRING)
    private SituacaoPessoaEnum situacaoPessoa;
    
    @ManyToOne
    @JoinColumn(name = "codigo_estabelecimento")
    private Estabelecimento estabelecimento;
    
    @OneToMany(mappedBy = "pessoa")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Collection<Endereco> enderecos;

    @OneToMany(mappedBy = "pessoa")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Collection<Email> emails;
    
    @OneToMany(mappedBy = "pessoa")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Collection<Telefone> telefones;

Até aqui tudo certo, a questão é, na hora de salvar os endereços desse cliente eu faço assim:

e na hora de salvar, ele salva todos os endereços e o cliente normal,sem precisar persistir o endereço antes da pessoa!

O problema é quandoo eu excluo um endereço, o endereço continua aparecendo!
Então eu mexi no edit do ClienteJpaController:

public void edit(Cliente cliente) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            //retorna o objeto salvo no banco de dados
            Cliente persistentCliente = em.find(Cliente.class, cliente.getCodigo_pessoa());
            
            /**
             * ENDEREÇOS
             */
            //carrega os endereçoes antigos
            Collection<Endereco> enderecosOld = persistentCliente.getEnderecos();
            //carrega os novos endereços
            Collection<Endereco> enderecosNew = cliente.getEnderecos();
            
            //passa por todos os endereços antigos
            for (Endereco enderecosOldEndereco : enderecosOld) {
                //se nos novos endereços nao conterem o antigo, significa q foi excluido
                if (!enderecosNew.contains(enderecosOldEndereco)) {
                    enderecosOldEndereco.setSituacao(false);
                    enderecosOldEndereco = em.merge(enderecosOldEndereco);
                }
            }
            
            /**
             * EMAILS
             */
            //carrega os endereçoes antigos
            Collection<Email> emailOld = persistentCliente.getEmails();
            //carrega os novos endereços
            Collection<Email> emailNew = cliente.getEmails();
            
            //passa por todos os endereços antigos
            for (Email emailOldEmail : emailOld) {
                //se nos novos endereços nao conterem o antigo, significa q foi excluido
                if (!emailNew.contains(emailOldEmail)) {
                    emailOldEmail.setSituacao(false);
                    emailOldEmail = em.merge(emailOldEmail);
                }
            }
            
            //salva as informações
            cliente.setEmails(emailNew);
            cliente.setEnderecos(enderecosNew);
            cliente = em.merge(cliente);
            
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = cliente.getCodigo_pessoa();
                if (findCliente(id) == null) {
                    throw new NonexistentEntityException("The cliente with id " + id + " no longer exists.");
                }
            }
            em.getTransaction().rollback();
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

No caso ele verifica o q foi excluido e seta a situação como FALSE!
Tem algum jeito que facilite isso? pq se não, em todos os lugares terei q criar essa estrutura…

[]'s