2016-05-24 2 views
1

Ich mache eine Anwendung basierend auf JPA/EclipseLink, ich implementiert eine Soft-Lösch-Funktionalität mit @AdditionalCriteria in der Root-Klasse der Hierarchie von Entitäten (alle Entitäten davon erben).Deaktivieren Sie zusätzliche Kriterien nur in einigen Entitätsbeziehungen

Mein Problem ist, dass ich jetzt eine spezielle Entität erstellen muss, die mehrere Beziehungen mit anderen Entitäten enthält; und ich muss alle relationierten Entitäten wiederherstellen, einschließlich der gelöschten. Es ist möglich, @AdditionalCriteria nur in den Beziehungen dieser speziellen Entität mit EclipseLink zu deaktivieren? Wenn nicht, was ist die beste Option, dies zu tun? Mein Code sieht wie folgt aus:

////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 { 
    ··· 
} 

Vielen Dank im Voraus

Antwort

0

Erstellen Sie eine neue Einheit für die gleiche Tabelle ohne die @AdditionalCriteria. Auf diese Weise können Sie alle Datensätze aus dieser Tabelle abrufen, ohne den zusätzlichen Filter anzuwenden.

Zum Beispiel:

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(); 
     } 
    } 
} 

Auch, wenn Ihr @AdditionalCriteria in einer Superklasse ist, können Sie es überschreiben, indem Sie ein neues leeres @AdditionalCriteria in einer Unterklasse erklärt:

können Sie definieren zusätzliche Kriterien für Entitäten oder zugeordnete Superklassen. Bei der Angabe auf der Ebene der zugeordneten Superklassen gilt die zusätzliche Definition für alle vererbenden Entitäten, es sei denn, diese Entitäten definieren ihre eigenen zusätzlichen Kriterien. In diesem Fall werden die für definierten zugeordneten Superklassen ignoriert.

@AdditionalCriteria doc

Verwandte Themen