Come prenotare un insieme di identificatori chiave primaria per il precaricamento dei dati bootstrap
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
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
evalueColumnName
. IlpkColumnValue
assegna ogni riga per un particolare generatore, e la colonna valore contiene l'ultima recuperate chiave primaria. Il provider di persistenza alloca fino a interiallocationSize
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'impostazioneinitialValue
.)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.