2015-09-11 16 views
8

Ho utilizzato il supporto dati di primavera senza alcun problema, ma ora ho un requisito che quando un utente esegue un'operazione DELETE su una determinata entità, ad esempio DELETE /accounts/<id> Ho bisogno di impostare un flag sulla marcatura del database quell'entità come cancellata ma voglio mantenere il record.Spring Data Rest - Soft Delete

Fondamentalmente ciò significa che è necessario eseguire un UPDATE anziché un'operazione DELETE nel database. Non trovo alcun modo per ignorare il comportamento della molla per il metodo delete (ID).

Alcuni codice:

@Entity 
@Table(name = "account") 
public class Account { 

    /* 
Default value for this field is false but when a receive a 
DELETE request for this entity i want to turn this flag 
to false instead of deleting the record. 
    */ 
    @Column(name = "deleted") 
    private boolean deleted; 

... 
} 

account Repository

@RepositoryRestResource 
public interface AccountRepository extends JpaRepository<Account, Integer> { 

} 

Tutte le idee?

+1

Vedere la mia risposta: [soft-elimina-con-primavera movimentazione--APP] (http: //stackoverflow.com/questions/19323557/handling-soft-deletes-with-spring-jpa/33168644#33168644) –

risposta

4

Si potrebbe cercare di creare repository personalizzati, per vedere come sarebbe giocare fuori

http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations

Ma eliminare non è l'unico posto che si' Ho bisogno di cambiare la tua logica. Vedo 2 modi per gestire requisito bandiera:

  1. avere una bandiera in più nella vostra definizione di entità, e aggiornarlo su Elimina.

    In questo caso è necessario prestare attenzione e riscrivere tutte le query esistenti, per assicurarsi che le entità rimosse non vengano restituite e tenere presente questa separazione dei risultati per tutte le entità future. (Anche se è possibile modificare SpringData a basso livello e aggiungere questo flag automaticamente).

  2. Eliminare l'entità dalla raccolta originale e aggiungerla a un'altra raccolta, in cui le entità vengono memorizzate prima del completo smaltimento.

    In questo caso è necessario disporre di una logica aggiuntiva per la gestione delle raccolte di smaltimento, ma ciò non ha implicazioni sulla logica delle query. È possibile integrare con l'applicazione esistente, con l'aggiunta di entità ascoltatore alla definizione JPA (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#jpa.auditing)

+1

Grazie, sono riuscito a farlo utilizzando un'annotazione @SoftDelete nell'entità che creava e seguiva il tutorial di primavera. (http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#repositories.custom-implementations) – ejoncas

+2

ciao ejoncas, potresti approfondire un po 'su come eri in grado per impostare quell'annotazione e usarla? – gtiwari333

+1

Non penso che l'annotazione @SoftDelete sia stata ancora rilasciata da spring-data-common – PRP

0

Penso che prima dovresti usare un'interfaccia per identificare solo le entità che useranno l'eliminazione soft. Successivamente è possibile sovrascrivere il metodo di cancellazione. Se l'entità è l'istanza di tale interfaccia, imposta il flag eliminato su true e chiama update else chiama la super implementazione. Usa SimpleJpaRepository invece di JpaRepository. Esempio per le interfacce https://github.com/danjee/hibernate-mappings potete trovare qui (Persistent e DefaultPersistent)

Problemi correlati