Отключить дополнительные критерии только в некоторых отношениях сущностей

Я делаю приложение на основе JPA/EclipseLink, я реализовал функцию мягкого удаления, используя @AdditionalCriteria в корневом классе иерархии объектов (все объекты наследуются от этого).

Моя проблема в том, что теперь мне нужно создать специальную сущность, которая содержит несколько связей с другими сущностями; и мне нужно восстановить все связанные сущности, в том числе удаленные. Возможно ли отключить @AdditionalCriteria только в отношениях этого специального объекта с EclipseLink? Если нет, что является лучшим вариантом для этого? Мой код выглядит следующим образом:

////Example of my top entity class (all others inherit from this)
@AdditionalCriteria("this.deleted = false")
public abstract class TopHierarchyClass {
  ···
  @Column(name = "deleted")
  protected boolean deleted = false;
  ···
}

//Example of entity that needs recover all relationed entities including soft deleted
@Entity
@Table(name = "special_entities")
public class SpecialEntity extends EntityBase {
  ···
  @JoinColumn(name = "iditem", referencedColumnName = "id")
  @ManyToOne(fetch = FetchType.LAZY)
  private Item item;
  ···
}

@Entity
@Table(name = "items")
public class Item extends EntityBase {
  ···
}

заранее спасибо

1 ответ

Решение

Создайте новый объект для той же таблицы без @AdditionalCriteria, Таким образом, вы можете извлечь все записи из этой таблицы без применения дополнительного фильтра.

Например:

public interface Person {
    Long getId();
    void setId(Long id);
    Date getDeletedAt();
    void setDeletedAt(Date deletedAt);
}

@MappedSupperclass
public class PersonEntity implements Person {
    @Id
    private Long id;
    private Date deletedAt;

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public Date getDeletedAt() { return deletedAt; }
    public void setDeletedAt(Date deletedAt) { this.deletedAt = deletedAt; }
}

@Entity
@Table(name = "people")
@AdditionalCriteria("this.deletedAt is null")
public class ActivePersonEntity extends PersonEntity {
}

@Entity
@Table(name = "people")
public class RawPersonEntity extends PersonEntity {
}

public class PeopleRepository {
    @PersistenceContext
    private EntityManager em;

    public List<Person> all() {
       return all(false);
    }

    public List<Person> all(boolean includeSoftDeleted) {
       if (!includeSoftDeleted) {
           return em.createQuery("select p from ActivePersonEntity p", ActivePersonEntity.class).getResultList();
       } else {
           return em.createQuery("select p from RawPersonEntity p", RawPersonEntity.class).getResultList();
       }
    }
}

Кроме того, если ваш @AdditionalCriteria находится в суперклассе, вы можете переопределить его, объявив новый пустой @AdditionalCriteria в подклассе:

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

@AdditionalCriteria doc

Другие вопросы по тегам