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?

È stato utile?

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 o natural-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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top