DAO
[code]@SuppressWarnings(“unchecked”)
public class GenericDAO<T extends AbstractEntity> {
protected static Session session;
protected static Transaction transaction;
public GenericDAO() {
    session = HibernateUtil.getSessionFactory().openSession();
    if (session.isConnected()) {
        session = HibernateUtil.getSessionFactory().openSession();
    }
}
public T getById(Long id) throws Exception {
    try {
        Class<?> tipo = getTypeClass();
        return (T) session.byId(tipo); /*Aqui tenho exceção..*/
    } catch (Exception e) {
        throw new Exception();
    }
}
public void save(T entity) throws Exception {
    try {
        transaction = session.beginTransaction();
        session.persist(entity);
        transaction.commit();
    } catch (Exception e) {
        transaction.rollback();
        throw e;
    }
}
public void update(T entity) throws Exception {
    try {
        transaction = session.beginTransaction();
        session.merge(entity);
        transaction.commit();
    } catch (Exception e) {
        transaction.rollback();
        throw e;
    }
}
public void delete(T entity) throws Exception {
    try {
        transaction = session.beginTransaction();
        session.delete(entity);
        transaction.commit();
    } catch (Exception e) {
        transaction.rollback();
        throw e;
    }
}
public List<T> findAll() throws Exception {
    return session.createQuery(("From " + getTypeClass().getName())).list();
}
/**
 * Retorna novo criteria para entidade.
 *
 * @return novo criteria para entidade.
 */
protected Criteria novoCriteria() throws Exception {
    Class<?> tipo = getTypeClass();
    return session.createCriteria(tipo);
}
private Class<?> getTypeClass() throws Exception {
    Class<?> clazz = (Class<?>) ((ParameterizedType) this.getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
    return clazz;
}
}[/code]
AbstractEntity
[code]@MappedSuperclass
public class AbstractEntity {
private Long id;
@Id
@GeneratedValue
public Long getId() {
    return id;
}
public void setId(Long id) {
    this.id = id;
}
}[/code]
Funcionario
@Entity
@Table(name = "funcionario")
public class Funcionario extends AbstractEntity {
O meu método getByid , não consegue executar o cast p/ classe funcionário, tenho a exceção: