evitare la duplicazione con il tasto di incremento automatico in Hibernate
Domanda
Sto cercando di usare Hibernate per incremento automatico l'id, però, cerco di evitare duplicazioni.
class Service
{
Long id; // auto increment
String name;
String owner;
Boolean incremental;
// setter and getter
}
Quello che voglio raggiungere è, ogni volta che il nuovo oggetto del servizio voglio salvare ha lo stesso nome e il proprietario (non importa se il campo dati incrementale sono gli stessi o no) come una delle esistente nel database, sarà una voce duplicata. In questo caso, non voglio aggiungere un'altra voce nel database più. Come rivedere i file hbm.xml per evitare questo problema?
Soluzione
Se avete bisogno di colonna ID, si può conservare. Quello che vi serve è * Un vincolo univoco a livello di database su entrambe le colonne.
(se si utilizza hbmtoddl strumento, potrebbe essere necessario qualcosa di simile:
<properties name="key" unique="true">
<property name="name" .../>
<property name="owner" .../>
</properties>
)
In questo modo, non è possibile inserire i dati duplicati.
Dopo di che, se non si vuole il codice a rompere quando si tenta di inserire i duplicati, è necessario
- ricerca per nome e proprietario (se si fa questo, spesso, un indice potrebbe essere una buona idea)
- se non si trova la voce, inserirla
- si potrebbe anche voler catturare l'eccezione generata in caso di violazione vincolo unico (sì che potrebbe ancora accadere se due thread stanno inserendo i dati allo stesso tempo) e riprovare a Selezionare.
Altri suggerimenti
È possibile utilizzare le annotazioni a fare lo stesso.
In cima a vostra classe di entità che si scrive il seguente:
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name","owner"}))
@Entity
class Service
{
Long id; // auto increment
String name;
String owner;
// setter and getter
}
Questo vi dirà letargo che le colonne nome e proprietario dovrebbe essere unico insieme.
Si dispone di un certo numero di opzioni:
- definire la chiave primaria come un
composite-id
onatural-id
- prima di salvare, utilizzare una query per trovare se c'è un'altra fila con lo stesso nome e proprietario, e se c'è - Get It .
In entrambi i casi si dovrebbe ignorare hashCode()
e equals(..)
utilizzando name
e owner