仅在某些实体关系中禁用其他条件

时间:2016-05-24 16:41:47

标签: jpa eclipselink soft-delete

我正在制作一个基于JPA / EclipseLink的应用程序,我在实体层次结构的根类中使用@AdditionalCriteria实现了一个软删除功能(所有实体都从此继承)。

我的问题是,现在,我需要创建一个包含与其他实体的多个关系的特殊实体;我需要恢复所有关联实体,包括软删除的实体。只有在这个特殊实体与EclipseLink的关系中,才可能禁用@AdditionalCriteria?如果没有,这样做的最佳选择是什么?我的代码如下所示:

////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 个答案:

答案 0 :(得分:0)

为没有@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