2012-06-01 24 views
7

Sto utilizzando questo codice in modalità ibernazione.Strategia Hibernate Value Value

@Id @GeneratedValue(strategy = GenerationType.AUTO) 
@Column(name="RightID", unique=true, nullable=false) 

Il problema è quando elimina una riga della 'RightId' non rimangono in sequenza. Voglio qualcosa di simile, ibernazione dovrebbe controllare id, se manca qualche valore id deve dare quel valore a 'RightsId' altrimenti procedere normalmente

risposta

4

Database non interessa se ci sono buchi nella sequenza. Inoltre, in generale è possibile e molto probabilmente più semplice cambiare la progettazione dell'applicazione in modo che non si aspetti che l'elenco dei valori di id non contenga buchi.

Se qualche strana ragione costringe un tale progetto, è necessario utilizzare un generatore personalizzato. I dettagli di implementazione possono essere trovati tramite questa domanda: Hibernate ID Generator

9

Non penso che ci sia alcuna optio disponibile in sospensione. invece di auto, è possibile provare le seguenti opzioni di strategia anche:

  1. GenerationType.TABLE - il provider di persistenza usa una tabella del database per la gestione delle chiavi.

  2. GenerationType.SEQUENCE - il provider di persistenza utilizza una sequenza di database per la generazione di chiavi. Il database deve supportare Sequenze

  3. GenerationType.IDENTITY - il provider di persistenza rinvia al database per la generazione delle chiavi. Il database deve supportare il tipo di colonna IDENTITY.

Un altro punto: potrebbero non aver fornito tale opzione perché rallenterà anche le prestazioni. Per ogni inserto, dovrà cercare tutta la colonna ID. Puoi immaginare quanto avrà un impatto su performace.

0

Il motivo principale per cui non è supportato internamente è sicurezza. lasciate che vi dia un esempio,

1. Sicurezza

Abbiamo un database per simcards mobili che ha il numero di identificazione univoco. Se il tuo sim è perso e poi lo hai disattivato. Ma diciamo che qualche altro utente ha acquistato una nuova sim e quella sim dato il vecchio numero unico che il tuo sim aveva (secondo la tua logica). Quindi potrebbe portare a un problema. Come diciamo che il nuovo utente ha fatto un atto terroristico, poi la polizia ha rintracciato quel numero sim e potrebbe venire da te (dato che era nuovo utente e alcuni in posti sim mostra ancora solo il tuo nome) ...

2 . latenza

E sicuramente la questione prestazioni c'è. Ogni ricerca per trovare il numero di sequenza inutilizzato sarà O (n) anziché semplice O (1).