Я реализую как мягкое, так и принудительное удаление в приложении JPA/Hibernate. Учитывая объект с SQLRestriction, определенный для ограничения каждого запроса в JPA для возврата необратимо удаленных данных:
Код: Выделить всё
@Entity
@SQLRestriction("deleted = false")
public class Product extends Auditables {
@Id
@SnowFlakeIdValue(name = "product_id")
@Column(name = "product_id", columnDefinition = "BIGINT", updatable = false, nullable = false)
@Column(name = "deleted", nullable = false)
private boolean deleted = false;
@Version
private Long version;
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private Set variants = new HashSet();
@OneToMany(mappedBy = "product", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private Set
images = new HashSet();
}
Означает ли это, что мы не можем выбирать данные, если соблюдено условие ограничения? В определенных случаях мне нужно запрашивать и управлять как неудаляемыми, так и мягко удаляемыми записями (например, для принудительного удаления), но @SQLRestriction применяется всегда и не может быть отключен или параметризован в соответствии с документацией Hibernate.
Дополнительная информация
Что касается обратимого удаления, то вместо использования @SoftDelete я обновляю поле «удалено» соответствующего продукта запроса.
Опробованные подходы
Поскольку я хотел иметь возможность как обратимого, так и принудительного удаления, я попробовал разные способы, продолжая использовать @ SQLRestriction, один из них был:
Код: Выделить всё
@Repository
public interface ProductRepository extends JpaRepository
{
@Query("SELECT p FROM Product p")
@SQLRestriction("")
List findAllUnfiltered();
@Modifying @Transactional
@Query("DELETE FROM Product p WHERE p.productId = :productId AND p.deleted IN (true, false)")
void deleteProductPermanently(@Param("productId") Long id);
@Modifying @Transactional
@Query("DELETE FROM Product p WHERE p.deleted IN (true, false)")
void deleteAllProductsPermanently();
}
Проблемы и вопросы
Есть ли способ обходить @SQLRestriction, когда это необходимо, сохраняя при этом автоматическую фильтрацию для обычных запросов? Если нет, то какой подход рекомендуется использовать?
- Переключиться на фильтры гибернации?
- Использовать EntityManager напрямую?
- Написание собственных SQL-запросов?
- Другие альтернативы?
Spring Boot Framework: 3.3.4
Спящий режим (.orm, ядро): 6.5.3 Final
Подробнее здесь: https://stackoverflow.com/questions/791 ... pa-queries
Мобильная версия