我正在制作一个基于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 {
···
}
提前致谢
答案 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
来覆盖它:
您可以在实体或映射的超类上定义其他条件。 在映射的超类级别指定时,附加条件 定义适用于所有继承实体,除非这些实体 定义他们自己的附加标准,在这种情况下定义的标准 映射的超类将被忽略。