ORM: mantenere le entità coerenti in una cache o recuperare le entità ogni volta?

1

Abbiamo una domanda complicata in un progetto che utilizza Java & Iberna, con un modello contenente relazioni bidirezionali.

Poiché si tratta di un piccolo progetto con pochi utenti, poche entità e poche righe coinvolte nelle relazioni (non più di 100 nelle relazioni 1-n), non abbiamo davvero bisogno di una cache di secondo livello.

Le operazioni eseguite con le entità sono semplici: inserire, rimuovere ed eseguire alcuni calcoli con entità che implicano il caricamento delle relazioni.

Supponiamo di avere due entità Java: Room e Furniture . Un mobile è in una stanza e una stanza può avere molti oggetti di arredamento. Quindi Furniture ha un riferimento a Room e Room ha un elenco di Furniture .

Per l'azione Delete Furniture , la cosa più semplice da fare è recuperare il giusto Furniture e dire a EntityManager di rimuovere Furniture . Tuttavia, per garantire che le istanze Java rimangano coerenti, dovremmo rimuovere anche l'istanza Furniture nell'elenco di Furniture s nel Room associato. Sfortunatamente, se l'istanza Room non è caricata, verrà effettuata una richiesta al database per nulla se non abbiamo una cache.

Quindi, quale sarebbe una scelta migliore tra:

A) Mantenendolo semplice

  • In generale, nessuna preoccupazione per le relazioni bilaterali nella coerenza delle istanze java, in quanto non abbiamo cache di secondo livello
  • Ben documenta il fatto che esiste una cache per azione, quindi se devono essere eseguiti calcoli specifici che richiedono la coerenza delle relazioni bilaterali all'interno di un'azione, questa azione deve curare la coerenza
  • Non è stato necessario alcun codice per le relazioni bilaterali per la gestione della coerenza
  • Nessun sovraccarico del caricamento di accessi non necessari
  • Se è necessario aggiungere una cache di secondo livello, è necessario eseguire un grande sforzo di refactoring

B) Mantenendolo coerente

  • Mantenere sempre la coerenza della relazione bilaterale
  • Abilita cache di secondo livello
posta cporte 11.02.2013 - 17:18
fonte

1 risposta

3

Personalmente farei la cosa più semplice che potrebbe funzionare: non correggere automaticamente le relazioni bilaterali.

In precedenza ho sviluppato e mantenuto un sistema che (tra le altre cose) ha fatto esattamente questo: assicurati che le relazioni tra gli oggetti di business siano sempre in sincrono con il DB (cioè se rimuovi un elemento, il l'altro è aggiornato di conseguenza). Era una parte piuttosto complessa del codice ed era piuttosto difficile tenere a mente tutti i casi d'angolo (non aiutava il fatto che questo supportasse anche le transazioni nidificate).

Tuttavia, se le transazioni commerciali sono ben definite e funzionano in modo indipendente l'una dall'altra e ciascuna viene eseguita nella propria transazione, tutta questa complessità apporta pochissimi vantaggi.

    
risposta data 11.02.2013 - 17:30
fonte

Leggi altre domande sui tag