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