Come prenotare un insieme di identificatori chiave primaria per il precaricamento dei dati bootstrap

StackOverflow https://stackoverflow.com/questions/2606182

Domanda

Vorremmo prenotare una serie di identificatori chiave primaria per tutte le tabelle (per esempio 1-1000) in modo da poter avviare il sistema con dati di sistema pre-caricati.

Tutte le classi di entità JPA hanno la seguente definizione per la chiave primaria.

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;

C'è un modo per dire al database che incrementi dovrebbero iniziare accadendo da 1000 (vale a dire i dati specifici del cliente partirà da 1000 in poi). Sosteniamo (h2, mysql, postgres) nel nostro ambiente e io preferirei una soluzione che può essere azionato da APP e gli strumenti di ingegneria inversa DDL da Hibernate.

Fammi sapere se questo è l'approccio corretto

È stato utile?

Soluzione

Si potrebbe provare la strategia TABLE invece di IDENTITY. Dal libro Hibernate:

  

Un po 'come la strategia hilo di Hibernate, TABLE   si basa su una tabella di database che contiene l'ultimo generato   intero valore di chiave primaria, e ogni   generatore viene mappato a una riga in questa tabella.   Ogni riga ha due colonne: pkColumnName   e valueColumnName. Il pkColumnValue assegna ogni riga per un particolare generatore,   e la colonna valore contiene l'ultima   recuperate chiave primaria. Il provider di persistenza   alloca fino a interi allocationSize   in ogni turno.

Ecco un esempio con più spiegazioni. E una più complessa esempio per impostare il valore iniziale.

Si potrebbe anche provare a utilizzare un generatore di sequenza personalizzato, definito nel orm.xml, in questo modo:

<sequence-generator name="mySequenceGenerator"
  sequence-name="MY_SEQUENCE"
  initial-value="123"
  allocation-size="20"/>
  

Questo dichiara che una sequenza di database denominato MY_SEQUENCE con un valore iniziale   di 123 possono essere utilizzati come fonte per la generazione di identificatore di database, e che la persistenza   motore dovrebbe ottenere 20 valori ogni volta ha bisogno di identificatori. (Nota,   però, che Hibernate annotazioni, al momento della scrittura, ignora l'impostazione initialValue.)

     

Per applicare questo generatore di identificatore per una particolare entità, utilizzare il suo nome:

@Entity
class name MyEntity {
  @Id @GeneratedValue(generator = "mySequenceGenerator")
  String id;
}

Altri suggerimenti

Se tutto il resto fallisce, si può sempre scrivere il proprio generatore di ID personalizzato e utilizzarlo in modo create(Entity entity) del DAO. La tabella di sequenza ID potrebbe essere qualcosa del tipo

-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

Questo potrebbe significare che gli ID per l'avvio tavolo foo al 1001 e vengono incrementati di 100 (in modo da non dover chiamare DB per ogni nuovo inserto tabella).

Questo è quello che stiamo usando senza problemi molto.

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