demoiselle / framework

Repositório principal contendo o Core e Extensions: JPA, Security, WS
https://demoiselle.org
127 stars 77 forks source link

Erro ao salvar com AbstractDAO.mergeHalf. #84

Closed emobtech closed 7 years ago

emobtech commented 7 years ago

Esta linha deveria referenciar a instância da entidade, não o objeto que representa sua classe. Por isso o erro abaixo:

"object is not an instance of declaring class"

https://github.com/demoiselle/framework/blob/master/demoiselle-crud/src/main/java/org/demoiselle/jee/crud/AbstractDAO.java#L76

emobtech commented 7 years ago

Segue sugestão de implementação completa para este método:

    /**
     * {@inheritDoc}
     */
    @Override
    public T mergeHalf(I id, T entity) {
        try {
            final Class<T> entityClass = getEntityClass();
            final StringBuilder sb = new StringBuilder();
            final Map<String, Object> params = new HashMap<>();
            //
            sb.append("UPDATE ");
            sb.append(entityClass.getCanonicalName());
            sb.append(" SET ");
            //
            for (final Field field : entityClass.getDeclaredFields()) {
                if (!field.isAnnotationPresent(Column.class)) {
                    continue;
                }
                //
                field.setAccessible(true);
                //
                final String name = field.getName();
                final Object value = field.get(entity);
                //
                if (value != null) {
                    sb.append(name).append(" = :").append(name);
                    params.put(name, value);
                }
            }
            //
            final String idName =
                CrudUtilHelper.getMethodAnnotatedWithID(entityClass);
            //
            sb.append(" WHERE ").append(idName).append(" = :").append(idName);
            params.put(idName, id);
            //
            final Query query = getEntityManager().createQuery(sb.toString());
            //
            for (final Map.Entry<String, Object> entry : params.entrySet()) {
                query.setParameter(entry.getKey(), entry.getValue());
            }
            //
            query.executeUpdate();
            //
            return entity;
        } catch (final Exception e) {
            throw new DemoiselleCrudException("Não foi possível salvar", e);
        }
    }
emobtech commented 7 years ago

https://github.com/demoiselle/framework/pull/85