Wie eine Reihe von Primär-Schlüsselkennungen für Vorbelastung Bootstrap-Daten reservieren
Frage
Wir möchten eine Reihe von Primär-Schlüsselkennungen für alle Tabellen reservieren (z 1-1000), so dass wir das System mit vorinstallierten Systemdaten Bootstrap können.
Alle unsere JPA Entitätsklassen haben die folgende Definition für den Primärschlüssel.
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
gibt es eine Möglichkeit, die Datenbank zu sagen, dass Schritten beginnen soll ab 1000 passiert (das heißt kundenspezifischen Daten werden ab 1000 beginnen ab). Wir unterstützen (h2, mysql, postgres
) in unserer Umwelt, und ich würde eine Lösung bevorzugen, die über JPA und Reverse-Engineering-DDL-Tools aus dem Ruhezustand gefahren werden können.
Lassen Sie mich wissen, ob dies der richtige Ansatz ist,
Lösung
Sie könnten versuchen, die TABLE
Strategie statt IDENTITY
. Aus dem Hibernate Buch:
Ähnlich wie
hilo
Strategie Hibernate,TABLE
stützt sich auf eine Datenbanktabelle, die die letzte hält erzeugt integer Primärschlüsselwert, und jedes Generator ist an eine Zeile in dieser Tabelle abgebildet. Jede Reihe hat zwei Spalten:pkColumnName
undvalueColumnName
. DiepkColumnValue
ordnet jede Zeile zu einem bestimmten Generator, und der Wert-Spalte enthält die letzte Primärschlüssel abgerufen. Die Persistenz-Provider ordnet bis zuallocationSize
ganze Zahlen in jeder Runde.
Hier ist ein Beispiel mit mehr Erklärung. Und ein komplexeres Beispiel für den Anfangswert Einstellung.
Sie könnten auch einen benutzerdefinierten Sequenzgenerator versuchen verwenden, definiert in Ihrem orm.xml
, wie folgt aus:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
Dies erklärt, dass eine Datenbank-Sequenz namens
MY_SEQUENCE
mit einem Anfangswert von 123 kann als eine Quelle für die Datenbankerzeugung Identifikator verwendet werden, und daß die Persistenz Motor soll 20 Werte erhält jedes Mal, es braucht Identifikatoren. (Hinweis, aber, dass Hibernate Annotations, die zum Zeitpunkt des Schreibens, ignoriert dieinitialValue
Einstellung.)Um diese Kennung Generator für eine bestimmte Einheit anwenden, benutzen Sie seinen Namen:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
Andere Tipps
Wenn alles andere fehlschlägt, können Sie Ihre eigenen kundenspezifischen ID-Generator immer schreiben und verwenden Sie es in Ihrem create(Entity entity)
Methode des DAO. Die ID-Sequenztabelle könnte so etwas wie
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
Das bei 1001, dass die IDs für Tabelle foo
Start bedeuten könnte und um 100 erhöht (so Sie müssen Einsatz nicht nennen DB für jede neue Tabelle).
Das ist, was wir ohne große Probleme mit.