Comment réserver un ensemble d'identificateurs de clé primaire pour précharger des données bootstrap
Question
Nous aimerions réserver un ensemble d'identificateurs de clé primaire pour toutes les tables (par exemple 1-1000) afin que nous puissions amorcer le système avec les données du système pré-chargées.
Toutes nos classes d'entités JPA ont la définition suivante pour la clé primaire.
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
est-il un moyen de dire la base de données par incréments devraient commencer à se produire à partir de 1000 (à savoir des données spécifiques des clients commenceront à partir de 1000 et suivantes). Nous soutenons (h2, mysql, postgres
) dans notre environnement et je préférerais une solution qui peut être entraîné par JPA et inverser les outils d'ingénierie de DDL Mise en veille prolongée.
Permettez-moi de savoir si cela est l'approche correcte
La solution
Vous pouvez essayer de la stratégie de TABLE
au lieu de IDENTITY
. Du livre Mise en veille prolongée:
Tout comme la stratégie
hilo
de mise en veille prolongée,TABLE
repose sur une table de base de données qui contient la dernière génération entier valeur de clé primaire, et chaque générateur est mis en correspondance avec une ligne de ce tableau. Chaque ligne a deux colonnes:pkColumnName
etvalueColumnName
. LepkColumnValue
attribue à chaque rangée à un générateur particulier, et la colonne de valeur contient la dernière récupéré la clé primaire. Le fournisseur de persistance affecte jusqu'à entiersallocationSize
à chaque tour.
Voici un exemple avec plus d'explications. Et un href="http://www.java2s.com/Code/Java/JPA/SetInitialValueOfTableGenerator.htm" pour définir la valeur initiale .
Vous pouvez également essayer d'utiliser un générateur de séquence personnalisée, définie dans votre orm.xml
, comme ceci:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
déclare qu'une séquence de base de données nommée
MY_SEQUENCE
avec une valeur initiale de 123 peut être utilisé comme une source pour la génération d'identificateur de base de données, et que la persistance moteur doit obtenir 20 valeurs chaque fois qu'il a besoin d'identifiants. (Remarque, cependant, que les annotations Hibernate, au moment de l'écriture, ignore le paramètreinitialValue
.)Pour appliquer ce générateur d'identifiant pour une entité particulière, utiliser son nom:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
Autres conseils
Si tout le reste échoue, vous pouvez toujours écrire votre propre générateur d'ID personnalisé et l'utiliser dans la méthode de create(Entity entity)
de votre DAO. Le tableau de séquence d'ID pourrait être quelque chose comme
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
Cela pourrait signifier que les ID pour la table foo
commencent à 1001 et sont augmentés de 100 (de sorte que vous ne devez pas appeler DB pour chaque nouvel insert de table).
C'est ce que nous utilisons sans beaucoup de problèmes.