Bom dia pessoal
Ao tentar persistir a minha classe Candidato, da um erro no hibernate de:
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Enum
	at org.hibernate.type.EnumType.nullSafeSet(EnumType.java:123)
	at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:155)
	at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:867)
	at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1257)
	at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
	at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
	at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:279)
	at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
	at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
	at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1210)
	at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:986)
	at com.sun.enterprise.container.common.impl.EntityManagerWrapper.flush(EntityManagerWrapper.java:418)
	at empresa.package.dao.AbstractDAO.gravar(AbstractDAO.java:60)
	... 91 more
A minha classe é
Candidato.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.modelo.endereco.Endereco;
import empresa.package.modelo.usuario.TipoUsuario;
import empresa.package.modelo.usuario.Usuario;
import empresa.package.modelo.vaga.Funcao;
import empresa.package.util.Util;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.joda.time.DateTime;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Entity
@Table(schema = "AcifEmpregos")
public class Candidato extends AbstractModelo implements Usuario {
    private static final int NOME_LENGTH = 60;
    private static final int EMAIL_LENGTH = 100;
    private static final int CPF_LENGTH = 11;
    private static final int SENHA_LENGTH = 32;
    private static final int RG_LENGTH = 20;
    private static final int DEFICIENCIA_LENGTH = 100;
    private static final int HABILIDADESQUALIFICACOES_LENGTH = 1024;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(nullable = false, length = NOME_LENGTH)
    private String nome;
    @Embedded
    private Endereco endereco;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataNascimento;
    @Enumerated(EnumType.STRING)
    private Sexo sexo;
    @Enumerated(EnumType.STRING)
    private EstadoCivil estadoCivil;
    @Column(length = EMAIL_LENGTH)
    private String email;
    @Column(length = CPF_LENGTH)
    private String cpf;
    @Column(length = SENHA_LENGTH)
    private String senha;
    @Column(length = RG_LENGTH)
    private String rg;
    private boolean possuiDeficiencia;
    @Column(length = DEFICIENCIA_LENGTH)
    private String deficiencia;
    @ElementCollection(targetClass = Cnh.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoCHN")
    @Enumerated(EnumType.STRING)
    private List<Cnh> cnh;
    @ElementCollection(targetClass = Periodo.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoPeriodo")
    @Enumerated(EnumType.STRING)
    private List<Periodo> periodo;
    private boolean disponivelViagem;
    private boolean salarioCombinar;
    private double pretensaoSalarial;
    @Column(length = HABILIDADESQUALIFICACOES_LENGTH)
    private String habilidadesQualificacoes;
    @ElementCollection(targetClass = Curso.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoCursos")
    private List<Curso> cursos;
    @OneToMany(mappedBy = "candidato")
    private List<ExperienciaProfissional> experienciaProfissionais;
    @ElementCollection(targetClass = Formacao.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoFormacao")
    private List<Formacao> formacoes;
    @ManyToMany
    @JoinTable(schema = "AcifEmpregos", name = "CandidatoFuncaoInteresse")
    private List<Funcao> funcoesInteresse;
    @ElementCollection(targetClass = Telefone.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoTelefone")
    private List<Telefone> telefones;
    @ElementCollection(targetClass = IdiomaCandidato.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoIdioma")
    private List<IdiomaCandidato> idiomas;
    //gets, sets, hashcode e equals removido
}
Endereco.java
package empresa.package.modelo.endereco;
import empresa.package.modelo.AbstractModelo;
import empresa.package.util.Util;
import java.io.Serializable;
import java.util.regex.Pattern;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.ManyToOne;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Embeddable
public class Endereco extends AbstractModelo {
    private static final int LOGRADOURO_LENGTH = 50;
    private static final int COMPLEMENTO_LENGTH = 20;
    private static final int BAIRRO_LENGTH = 30;
    private static final int CIDADE_LENGTH = 50;
    private static final int CEP_LENGTH = 8;
    private Integer seqEnderecoGeral;
    @Column(nullable = false, length = LOGRADOURO_LENGTH)
    private String logradouro;
    private Integer numero;
    @Column(length = COMPLEMENTO_LENGTH)
    private String complemento;
    @Column(nullable = false, length = BAIRRO_LENGTH)
    private String bairro;
    @Column(nullable = false, length = CIDADE_LENGTH)
    private String cidade;
    @ManyToOne
    private Estado estado;
    @Column(nullable = false, length = CEP_LENGTH)
    private String cep;
    //gets, sets, hashcode e equals removido
}
Sexo.java
package empresa.package.modelo.candidato;
/**
 *
 * @author thales @data 25/06/2012
 */
public enum Sexo {
    MASCULINO("Masculino"),
    FEMININO("Feminino");
    private String descricao;
    public String getDescricao() {
        return descricao;
    }
    private Sexo(String descricao) {
        this.descricao = descricao;
    }
}
EstadoCivil.java
package empresa.package.modelo.candidato;
/**
 *
 * @author thales @data 25/06/2012
 */
public enum EstadoCivil {
    SOLTEIRO("Solteiro (a)"),
    CASADO("Casado (a)"),
    DIVORCIADO("Divorciado (a)"),
    VIUVO ("Viúvo (a)"),
    UNIAO_ESTAVEL("União Estável");
    private String descricao;
    public String getDescricao() {
        return descricao;
    }
    private EstadoCivil(String descricao) {
        this.descricao = descricao;
    }
}
Cnh.java
package empresa.package.modelo.candidato;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
public enum Cnh {
    A("A"), B("B"), C("C"), D("D"), E("E");
    private String descricao;
    private Cnh(String descricao) {
        this.descricao = descricao;
    }
    public String getDescricao() {
        return descricao;
    }
}
Periodo.java
package empresa.package.modelo.candidato;
/**
 *
 * @author thales @data 25/06/2012
 */
public enum Periodo {
    MANHA("Manhã"),
    TARDE("Tarde"),
    NOITE("Noite");
    private String descricao;
    public String getDescricao() {
        return descricao;
    }
    private Periodo(String descricao) {
        this.descricao = descricao;
    }
}
Curso.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.util.Util;
import java.io.Serializable;
import javax.persistence.*;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Embeddable
public class Curso extends AbstractModelo {
    private static final int DESCRICAO_LENGTH = 60;
    @Column(nullable = false, length = DESCRICAO_LENGTH)
    private String descricao;
    private Integer mesInicial;
    private Integer anoInicial;
    private Integer mesFinal;
    private Integer anoFinal;
    private Integer cargaHoraria;
    private boolean concluido;
    //gets, sets, hashcode e equals removido
}
ExperienciaProfissional.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.modelo.endereco.Endereco;
import empresa.package.modelo.vaga.Area;
import empresa.package.modelo.vaga.Cargo;
import empresa.package.modelo.vaga.Funcao;
import empresa.package.util.Util;
import java.io.Serializable;
import java.util.List;
import javax.persistence.*;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Entity
@Table(schema = "AcifEmpregos", name = "CandidatoExpProf")
public class ExperienciaProfissional extends AbstractModelo {
    private static final int EMPRESA_LENGTH = 60;
    private static final int RESPONSAVEL_LENGTH = 60;
    private static final int DESCRICAO_FUNCOES_LENGTH = 1024;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @ManyToOne
    private Candidato candidato;
    @Column(nullable = false, length = EMPRESA_LENGTH)
    private String empresa;
    @Column(nullable = false, length = RESPONSAVEL_LENGTH)
    private String responsavel;
    @Embedded
    private Endereco endereco;
    private Integer mesInicial;
    private Integer anoInicial;
    private Integer mesFinal;
    private Integer anoFinal;
    private boolean empregoAtual;
    @Column(nullable = false, length = DESCRICAO_FUNCOES_LENGTH)
    private String descricaoFuncoes;
    @ManyToOne(cascade = CascadeType.ALL, optional = false)
    private Area area;
    @ManyToMany
    @JoinTable(schema = "AcifEmpregos", name = "CandidatoExpProfFuncao")
    private List<Funcao> funcao;
    @ManyToOne(cascade = CascadeType.ALL, optional = false)
    private Cargo cargo;
    @ElementCollection(targetClass = Telefone.class)
    @CollectionTable(schema = "AcifEmpregos", name = "CandidatoExpProfTelefone")
    private List<Telefone> telefones;
    //gets, sets, hashcode e equals removido
}
Formacao.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.modelo.endereco.Estado;
import empresa.package.modelo.vaga.Area;
import empresa.package.util.Util;
import java.io.Serializable;
import javax.persistence.*;
/**
 *
 * @author thales
 * @data 26/06/2012
 */
@Embeddable
public class Formacao extends AbstractModelo {
    private static final int DESCRICAO_LENGTH = 100;
    private static final int INSTITUICAO_LENGTH = 100;
    private static final int CIDADE_LENGTH = 50;
    @Column(length = DESCRICAO_LENGTH, nullable = false)
    private String descricao;
    private Integer mesInicial;
    private Integer anoInicial;
    private Integer mesFinal;
    private Integer anoFinal;
    private boolean concluido;
    @Column(length = INSTITUICAO_LENGTH, nullable = false)
    private String instituicao;
    @Column(length = CIDADE_LENGTH, nullable = false)
    private String cidade;
    @ManyToOne
    private Estado estado;
    @Enumerated(EnumType.STRING)
    private Grau grau;
    @ManyToOne
    private Area area;
    //gets, sets, hashcode e equals removido
}
Funcao.java
package empresa.package.modelo.vaga;
import empresa.package.modelo.AbstractModelo;
import empresa.package.util.Util;
import java.io.Serializable;
import javax.persistence.*;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Entity
@Table(schema = "AcifEmpregos")
public class Funcao extends AbstractModelo {
    private static final int DESCRICAO_LENGTH = 100;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(length = DESCRICAO_LENGTH, nullable = false)
    private String descricao;
    @ManyToOne
    private Area area;
    //gets, sets, hashcode e equals removido
}
Telefone.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.util.Util;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Embeddable
public class Telefone extends AbstractModelo {
    private static final int NUMERO_TAMANHO = 20;
    @Column(nullable = false, length = NUMERO_TAMANHO)
    private String numero;
    @Enumerated(EnumType.STRING)
    private TipoTelefone tipoTelefone;
    //gets, sets, hashcode e equals removido
}
IdiomaCandidato.java
package empresa.package.modelo.candidato;
import empresa.package.modelo.AbstractModelo;
import empresa.package.modelo.endereco.Estado;
import empresa.package.modelo.vaga.Idioma;
import empresa.package.util.Util;
import java.io.Serializable;
import javax.persistence.*;
/**
 *
 * @author thales
 * @data 25/06/2012
 */
@Embeddable
public class IdiomaCandidato extends AbstractModelo {
    private static final int INSTITUICAO_LENGTH = 100;
    private static final int CIDADE_LENGTH = 50;
    @ManyToOne(optional = false)
    private Idioma idioma;
    @Enumerated(EnumType.STRING)
    private Nivel nivel;
    private Integer mesInicial;
    private Integer anoInicial;
    private Integer mesFinal;
    private Integer anoFinal;
    private boolean concluido;
    @Column(length = INSTITUICAO_LENGTH, nullable = false)
    private String instituicao;
    @Column(length = CIDADE_LENGTH, nullable = false)
    private String cidade;
    @ManyToOne
    private Estado estado;
    //gets, sets, hashcode e equals removido
}