private ArrayList<Field> getFieldsAndValues(Object entity) {
        Class entityClass = entity.getClass();
        String className = entityClass.toString();
        ArrayList<Field> fields = entityCache.getOrmFields(className);

        if(null == fields) fields = new ArrayList<Field>();

        ArrayList<java.lang.reflect.Field> reflectFieldsList = entityCache.getReflectFields(className);
        java.lang.reflect.Field reflectFields[];

        if(reflectFieldsList != null)
            reflectFields = (java.lang.reflect.Field[]) reflectFieldsList.toArray();
        else
            reflectFields = entityClass.getFields();

        for (java.lang.reflect.Field field : reflectFields) {
            TableField tableField = (TableField) field.getAnnotation(TableField.class);
            if (tableField != null) {
                try {
                    fields.add(new Field(field.getName(), String.valueOf(field.get(entity)), tableField));
                } catch(NullPointerException e) {
                    fields.add(new Field(field.getName(), "", tableField));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }

        return fields;
    }