Использование Hibernate @SQLDelete для Soft Delete для всех объектов - PullRequest
3 голосов
/ 05 января 2012

У нас довольно сложная модель данных, и мы используем Hibernate и Spring Data JPA поверх MySQL.У нас есть базовый класс, который расширяет все доменные объекты, чтобы минимизировать код котельной пластины.Я хотел бы иметь возможность добавить функцию мягкого удаления для всех наших доменных объектов, используя только этот класс.Однако для @SQLDelete требуется имя таблицы в предложении:

@SQLDelete(sql="UPDATE (table_name) SET deleted = '1' WHERE id = ?")
@Where(clause="deleted <> '1'")

Кто-нибудь знает способ обобщить оператор SQLDelete и позволить расширяющимся объектам домена заполнять свои собственные имена таблиц?

Ответы [ 3 ]

3 голосов
/ 22 января 2016

Если вы используете спящий режим и @SQLDelete, у вас не будет простого решения вашего вопроса.Но вы можете рассмотреть другой подход к мягкому удалению с языком выражений Spring Data:

@Override
@Query("select e from #{#entityName} e where e.deleteFlag=false")
public List<T> findAll();

//recycle bin
@Query("select e from #{#entityName} e where e.deleteFlag=true")
public List<T> recycleBin(); 

@Query("update #{#entityName} e set e.deleteFlag=true where e.id=?1")
@Modifying
public void softDelete(String id); 
//#{#entityName} will be substituted by concrete entity name automatically.

Переписать базовый репозиторий следующим образом.Все интерфейсы подпозитория будут иметь возможность мягкого удаления.

0 голосов
/ 07 июля 2018

Другой подход, который может быть более гибким.

На уровне объекта создайте

@MappedSuperclass
public class SoftDeletableEntity {

    public static final String SOFT_DELETED_CLAUSE = "IS_DELETED IS FALSE";

    @Column(name = "is_deleted")
    private boolean isDeleted;
    ...

}

Обновите объект, который должен быть мягко удаляемым

@Entity
@Where(clause = SoftDeletableEntity.SOFT_DELETED_CLAUSE)
@Table(name = "table_name")
public class YourEntity extends SoftDeletableEntity  {...}

СоздатьПользовательский интерфейсный репозиторий, который расширяет репозиторий Spring.Добавить методы по умолчанию для мягкого удаления.Это должно быть базовым репо для ваших репозиториев.например,

    @NoRepositoryBean
    public interface YourBaseRepository<T, ID> extends JpaRepository<T, ID> {


        default void softDelete(T entity) {

            Assert.notNull(entity, "The entity must not be null!");
            Assert.isInstanceOf(SoftDeletableEntity.class, entity, "The entity must be soft deletable!");

            ((SoftDeletableEntity)entity).setIsDeleted(true);
            save(entity);
        }

        default void softDeleteById(ID id) {

            Assert.notNull(id, "The given id must not be null!");
            this.softDelete(findById(id).orElseThrow(() -> new EmptyResultDataAccessException(
                    String.format("No %s entity with id %s exists!", "", id), 1)));
        }


    }

ПРИМЕЧАНИЕ. Если ваше приложение не имеет полного удаления, вы можете добавить

    String HARD_DELETE_NOT_SUPPORTED = "Hard delete is not supported.";

    @Override
    default void deleteById(ID id) {
        throw new UnsupportedOperationException(HARD_DELETE_NOT_SUPPORTED);
    }

    @Override
    default void delete(T entity) {
        throw new UnsupportedOperationException(HARD_DELETE_NOT_SUPPORTED);
    }

    @Override
    default void deleteAll(Iterable<? extends T> entities) {
        throw new UnsupportedOperationException(HARD_DELETE_NOT_SUPPORTED);
    }

    @Override
    default void deleteAll() {
        throw new UnsupportedOperationException(HARD_DELETE_NOT_SUPPORTED);
    }

Надеюсь, это может быть полезно.

0 голосов
/ 11 мая 2012

Посмотрите на мой ответ здесь , который описывает, как реализовать это с помощью DeleteEventListener

...