Combox Dependientes Hibernate !Ayuda

Espero me puedan ayudar en esta situación tengo un proyecto web realizado con primefaces y hibernate el asunto aqui es que al momento de carga un combo box dependiente de otro, al momento de guardar me genera un error y no guarda en la base de datos. les expongo mi codigo para que ayuden a ver que error estoy cometiendo.

Mapeos de las clases

 public class Medico  implements java.io.Serializable {

     private Integer idDoctor;
     private Especialidad especialidad;
     private String nombre;
     private String apellidoPaterno;
     private String apellidoMaterno;
     private Date fechaNacimiento;
     private int edad;
     private String direccion;
     private String poblacion;
     private String provincia;
     private int telefono;
     private String departamento;
     private Set visitases = new HashSet(0);

    public Medico() {
    }

       
    public Medico(Especialidad especialidad, String nombre, String apellidoPaterno, String apellidoMaterno, Date fechaNacimiento, int edad, String direccion, String poblacion, String provincia, int telefono, String departamento) {
        this.especialidad = especialidad;
        this.nombre = nombre;
        this.apellidoPaterno = apellidoPaterno;
        this.apellidoMaterno = apellidoMaterno;
        this.fechaNacimiento = fechaNacimiento;
        this.edad = edad;
        this.direccion = direccion;
        this.poblacion = poblacion;
        this.provincia = provincia;
        this.telefono = telefono;
        this.departamento = departamento;
    }
    public Medico(Especialidad especialidad, String nombre, String apellidoPaterno, String apellidoMaterno, Date fechaNacimiento, int edad, String direccion, String poblacion, String provincia, int telefono, String departamento, Set visitases) {
       this.especialidad = especialidad;
       this.nombre = nombre;
       this.apellidoPaterno = apellidoPaterno;
       this.apellidoMaterno = apellidoMaterno;
       this.fechaNacimiento = fechaNacimiento;
       this.edad = edad;
       this.direccion = direccion;
       this.poblacion = poblacion;
       this.provincia = provincia;
       this.telefono = telefono;
       this.departamento = departamento;
       this.visitases = visitases;
    }
   
    public Integer getIdDoctor() {
        return this.idDoctor;
    }
   
    public void setIdDoctor(Integer idDoctor) {
        this.idDoctor = idDoctor;
    }
    public Especialidad getEspecialidad() {
        return this.especialidad;
    }
   
    public void setEspecialidad(Especialidad especialidad) {
        this.especialidad = especialidad;
    }
    public String getNombre() {
        return this.nombre;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public String getApellidoPaterno() {
        return this.apellidoPaterno;
    }
   
    public void setApellidoPaterno(String apellidoPaterno) {
        this.apellidoPaterno = apellidoPaterno;
    }
    public String getApellidoMaterno() {
        return this.apellidoMaterno;
    }
   
    public void setApellidoMaterno(String apellidoMaterno) {
        this.apellidoMaterno = apellidoMaterno;
    }
    public Date getFechaNacimiento() {
        return this.fechaNacimiento;
    }
   
    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }
    public int getEdad() {
        return this.edad;
    }
   
    public void setEdad(int edad) {
        this.edad = edad;
    }
    public String getDireccion() {
        return this.direccion;
    }
   
    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }
    public String getPoblacion() {
        return this.poblacion;
    }
   
    public void setPoblacion(String poblacion) {
        this.poblacion = poblacion;
    }
    public String getProvincia() {
        return this.provincia;
    }
   
    public void setProvincia(String provincia) {
        this.provincia = provincia;
    }
    public int getTelefono() {
        return this.telefono;
    }
   
    public void setTelefono(int telefono) {
        this.telefono = telefono;
    }
    public String getDepartamento() {
        return this.departamento;
    }
   
    public void setDepartamento(String departamento) {
        this.departamento = departamento;
    }
    public Set getVisitases() {
        return this.visitases;
    }
   
    public void setVisitases(Set visitases) {
        this.visitases = visitases;
    }

}

public class Especialidad  implements java.io.Serializable {

     private Integer idEspecialidad;
     private String nombre;
     private Set medicos = new HashSet(0);

    public Especialidad() {
    }

       
    public Especialidad(String nombre) {
        this.nombre = nombre;
    }
    public Especialidad(String nombre, Set medicos) {
       this.nombre = nombre;
       this.medicos = medicos;
    }
   
    public Integer getIdEspecialidad() {
        return this.idEspecialidad;
    }
   
    public void setIdEspecialidad(Integer idEspecialidad) {
        this.idEspecialidad = idEspecialidad;
    }
    public String getNombre() {
        return this.nombre;
    }
   
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public Set getMedicos() {
        return this.medicos;
    }
   
    public void setMedicos(Set medicos) {
        this.medicos = medicos;
    }

}

Tengo relacionadas estas tablas lo que quiero es obtener el id de la especialidad en la tabla medicos y cargarla en el combo box y guardarla.

DaoMedico

public interface MedicoDao {
    public List<Medico>mostrar();
    public void insertar(Medico medico);
    public void editar(Medico medico);
    public void eliminar(Medico medico);
    public List<Especialidad>selectItems();
   
   
   
}

Implementacion

public class MedicoDaoImpl implements MedicoDao{

    @Override
    public List<Medico> mostrar() {
        Session session=null;
        List<Medico> lista=null;
       
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            Query query=session.createQuery("from Medico");
            lista=(List<Medico>)query.list();
           
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        finally{
            if(session!=null){
                session.close();
            }
        }
       
        return lista;
    }

    @Override
    public void insertar(Medico medico) {
       Session session=null;
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(medico);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            session.getTransaction().rollback();
        }
    }

    @Override
    public void editar(Medico medico) {
        Session session=null;
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.update(medico);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            session.getTransaction().rollback();}
    }

    @Override
    public void eliminar(Medico medico) {
        Session session=null;
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.delete(medico);
            session.getTransaction().commit();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            session.getTransaction().rollback();}
    }

    @Override
    public List<Especialidad> selectItems() {
       
        Session session=null;
        List<Especialidad> lista1=null;
       
        try {
            session=HibernateUtil.getSessionFactory().openSession();
            Query query=session.createQuery("from Especialidad");
            lista1=(List<Especialidad>)query.list();
           
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        finally{
            if(session!=null){
                session.close();
            }
        }
       
        return lista1;
       
    }
   

   
   
   
}

Bean Administrado

@ManagedBean(name="medico")
@ViewScoped
public class MedicoBean {
  private  Medico medico;
  private List<Medico>medicos;
  private List<SelectItem>selectOneItemEsp;
  private Especialidad especialidad;
  public MedicoBean(){
      especialidad=new Especialidad();
      medico=new Medico();
     
  }

    public Especialidad getEspecialidad() {
        return especialidad;
    }

    public void setEspecialidad(Especialidad especialidad) {
        this.especialidad = especialidad;
    }
 
 

    public List<SelectItem> getSelectOneItemEsp() {
      this.selectOneItemEsp=new ArrayList<SelectItem>();
      MedicoDao espDao=new MedicoDaoImpl();
      List<Especialidad> especialidades = espDao.selectItems();
        for (Especialidad rol : especialidades) {
           
             SelectItem selectItem = new SelectItem(rol.getNombre());
              this.selectOneItemEsp.add(selectItem);
             
             
        }
         
        return selectOneItemEsp;
    }

 
   

   

    public Medico getMedico() {
        return medico;
    }

    public void setMedico(Medico medico) {
        this.medico = medico;
    }

    public List<Medico> getMedicos() {
        MedicoDao med=new MedicoDaoImpl();
        medicos=med.mostrar();
        return medicos;
    }

    public void setMedicos(List<Medico> medicos) {
        this.medicos = medicos;
    }
 
  public void insertar(){
      MedicoDao espi=new MedicoDaoImpl();
         
         espi.insertar(medico);
         medico=new Medico();
         
         FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Guardado correctamente") );
  }
   
 public void editar(){
     MedicoDao espi=new MedicoDaoImpl();
         
         espi.editar(medico);
         medico=new Medico();
         FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Editado correctamente") );
 }
  public void eliminar(){
      MedicoDao espi=new MedicoDaoImpl();
         
         espi.eliminar(medico);
         medico=new Medico();
         FacesContext context = FacesContext.getCurrentInstance();
        context.addMessage(null, new FacesMessage("Eliminado correctamente") );
  }  
   
}

Archivo xhtml

  <div class="jumbotron">
       
     
        <p:panel id="panel" header="Administracion de Medicos">
            <h:form id="insertar">
                <p:growl id="growl" showDetail="true" sticky="true" />
                <h:panelGrid columns="2" cellpadding="5">
                    <h:outputLabel value="ID"/>
                    <p:inputText disabled="true"  value="#{medico.medico.idDoctor}"/>
                    <h:outputLabel value="Especialidad"/>

                   /********** Aqui quiero cargarlos para despues guardarlos************/
                    <p:selectOneMenu id="med"  style="width:135px" value="#{medico.especialidad.nombre}">
                        <f:selectItems itemLabel="Selecciona" itemValue=" " />
                        <f:selectItems  value="#{medico.selectOneItemEsp}" />
                    </p:selectOneMenu>

                    /*********************************************************************************/

                    <h:outputLabel value="Nombre" />
                    <p:inputText value="#{medico.medico.nombre}"/>
                    <h:outputLabel value="Apellido Paterno" />
                    <p:inputText value="#{medico.medico.apellidoPaterno}"/>
                    <h:outputLabel value="Apellido Materno" />
                    <p:inputText value="#{medico.medico.apellidoMaterno}"/>
                    <h:outputLabel value="Fecha Nacimiento" />
                    <p:calendar value="#{medico.medico.fechaNacimiento}"/>
                    <h:outputLabel value="Edad" />
                    <p:inputText value="#{medico.medico.edad}"/>
                    <h:outputLabel value="Direccion" />
                    <p:inputText value="#{medico.medico.direccion}"/>
                    <h:outputLabel value="Poblacion" />
                    <p:inputText value="#{medico.medico.poblacion}"/>
                    <h:outputLabel value="Provincia" />
                    <p:inputText value="#{medico.medico.provincia}"/>
                    <h:outputLabel value="Telefono" />
                    <p:inputText value="#{medico.medico.telefono}"/>
                    <h:outputLabel value="Departamento" />
                    <p:inputText value="#{medico.medico.departamento}"/>
                   
                   
                   
                   
                   
                    <p:commandButton value="Guardar" action="#{medico.insertar()}" update="growl,panel"  />
                   
                   
                </h:panelGrid>
               
            </h:form>
           
           
   
        </p:panel>
       
       
       
        </div>

el error que marca es el siguiente

<Warning> <org.hibernate.engine.jdbc.spi.SqlExceptionHelper> <BEA-000000> <SQL Error: 1048, SQLState: 23000>
 <Error> <org.hibernate.engine.jdbc.spi.SqlExceptionHelper> <BEA-000000> <Column 'id_especialidad' cannot be null>
could not execute statement
Hibernate: select especialid0_.id_especialidad as id_espec1_0_, especialid0_.nombre as nombre2_0_ from seguro.especialidad especialid0_
rg.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 1048, SQLState: 23000
 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Column 'id_especialidad' cannot be null

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Pues eso, le estás pasando

Pues eso, le estás pasando null en idEspecialidad