Sì, è possibile implementare il modello Flyweight con Hibernate.
Il modello di peso mosca consente di ridurre al minimo l'utilizzo della memoria per istanza. La strategia è quella di condividere quanto più stato possibile tra le istanze di Flyweight. Nel tuo caso lo stato condivisibile è , eccetto l'identificatore di oggetto di ibernazione e qualche stato aggiuntivo per mantenere l'identità dell'oggetto.
Ciascuna istanza di tipo flyweight ha bisogno del proprio object identity. Lo stato aggiuntivo è il modo di implementare l'identità per distinguere tra oggetti che condividono lo stato comune.
public boolean equals(Object obj){
Fly other; [..]//check type
//null checks ommitted
return other.myState.equals(myState) && other.commonState.equals(commonState);
}
Se l'identità di un oggetto è condiviso tra le istanze di sospensione sarebbe interpretare tutte le istanze fisiche (riferimenti) come la stessa istanza. Hibernate utilizza il metodo equals per verificare l'identità dell'oggetto e l'implementazione equa dovrebbe restituire (! a.equals(a) == true)
che è illegale. Equal deve essere riflessivo. Se si rompe questo contratto, tutte le librerie che dipendono dal contratto verranno interrotte (raccolte, ibernazione, ecc.).
Non è possibile implementare il metodo di uguale utilizzando l'identificatore di oggetto di ibernazione per distinguere tra gli oggetti. Ciò renderebbe l'identità dell'oggetto dipendente dallo stato di persistenza (persistente o transitorio).
Un modo per modellare lo stato comune in modalità di sospensione è un'associazione uno-a-molti tra oggetti di stato condivisi e oggetti volanti. (Forse qualcuno ha un'idea di come mappare i dati senza unire due tabelle?)
Stringa: Solo internalized strings sarà condiviso. Questa non è la soluzione migliore per la maggior parte del tempo. È appropriato per i simboli (nome classe, nome metodo, ecc.). Le stringhe internalizzate non verranno mai raccolte da garbage collection e sarà necessario disporre di un'istanza String che verrà raccolta automaticamente in ogni caso new String("..").intern()
. Non salverà le allocazioni. C'è solo il piccolo vantaggio che la stringa di base non sopravviverà alla generazione gc o potrebbe essere allocata nello stack (con l'analisi di escape in hot spot abilitata e applicabile).
fonte
2009-11-29 07:15:06
Il tipo di utente è una buona idea per mappare lo stato comune delle istanze Flyweight. (Hibernate e JDBC inizieranno ancora un sacco di istanze. Non c'è modo di aggirarlo. Almeno saranno garbage collection abbastanza rapidamente.) Un CompositeUserType può rappresentare l'intero stato comune in un oggetto? –
Sì, un tipo di utente composito potrebbe probabilmente farlo, ma allora perché avere l'entità come entità in primo luogo? Basta che sia un oggetto valore (componente) dall'inizio. –