Comment réserver un ensemble d'identificateurs de clé primaire pour précharger des données bootstrap

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

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

Était-ce utile?

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   et valueColumnName. Le pkColumnValue 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'à entiers allocationSize   à 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ètre initialValue.)

     

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top