Vorrei sapere se c'è un modo - forse con AOP - per estendere le definizioni di tabelle / entità in modo che io possa aggiungere funzionalità su tutta la linea che richiede persistenza.
Lascia che ti spieghi cosa voglio fare con un esempio concreto. Supponiamo di avere un semplice sistema di e-commerce:
- Utente
- id
- nome
- Password
- Articolo
- id
- nome
- prezzo
- Immagine
- ShoppingCart
- id
- user_id
- ShoppingCartItems
- id
- shopping_cart_id
- item_id
- Ordinare
- id
- shopping_cart_id
- Acquisto
- id
- order_id
- INVOICE_NUMBER
Ora, supponiamo di pensare:
hey, wouldn't it be great if we could add a field to timestamp all entities?
Ora sapresti cose come:
- Quando un utente si è registrato
- Quando è stato creato un elemento
- Quando è stato creato un carrello acquisti
- Quando un articolo è stato aggiunto a un carrello
- Quando è stato effettuato un ordine
- Quando è stato elaborato e pagato l'ordine
Ora hai un'altra grande idea:
What if there was a status field for all entities so I could soft-delete or archive items, etc.
E ancora un'altra idea:
What if there was a text field called
meta
to serialize unimportant data, but that could help adding functionality without painful database modifications.
Ci sono soluzioni che posso pensare (soddisfare i requisiti di integrità relazionale):
-
Ovviamente, devi tornare indietro, modificare le tabelle, modificare le implementazioni in modo che durante la creazione / aggiornamento tu salvi il
timestamp
dell'operazione allora, lo stesso perstatus
, lo stesso permeta
. -
E un modo un po 'contorto ma molto modulare. Crea una sorta di plugin, che crea una tabella che gestisce il campo e 1 pivot per ogni entità. E attraverso eventi, associare i dati estesi alle entità esistenti di conseguenza.
Ma se ... potresti semplicemente dire a Hibernate di estendere le definizioni della tabella in fase di programmazione e aggiungere i comportamenti di persistenza attraverso qualcosa come AOP per iniettare funzionalità.
In realtà ho fatto la prima cosa (estendendo progressivamente le definizioni delle tabelle al di fuori dell'implementazione esistente) con successo in Doctrine una volta, ma sto appena iniziando a imparare Hibernate. OTOH, sto appena iniziando ad apprendere Spring e conosco le basi su AOP, quindi almeno nella mia mente è possibile intercettare il processo di configurazione di Hibernate dove capisce le definizioni delle tabelle.
Quindi, questo è possibile con Spring e Hibernate ?, come ?, puoi fornire un esempio?
Addendum : il problema è che ho bisogno di farlo più di una volta e potrebbe provenire da qualsiasi luogo. AOP è stata la mia risposta al problema dell'ereditarietà multipla poiché estendere le lezioni sarebbe stato troppo limitato, tuttavia, in passato l'ho fatto con Events e ho funzionato altrettanto bene ... IIRC il problema è che ho dovuto hackerare Doctrine per fare questo per attivare un evento nel momento in cui la descrizione del modello veniva convertita da file di configurazione in modelli reali.
AOP non è un must, è solo un'idea per un approccio se tale meccanismo di iniezione di eventi o dipendenze non è già in atto. Un altro approccio potrebbe essere mixin, ma torno ad AOP come probabilmente la soluzione più elegante.
Il requisito principale qui è quello di non modificare il codice del modello originale.
Disclaimer : non sono un esperto di AOP, ma sono abbastanza familiare ai concetti.