Wie eine Reihe von Primär-Schlüsselkennungen für Vorbelastung Bootstrap-Daten reservieren

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

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,

War es hilfreich?

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   und valueColumnName. Die pkColumnValue ordnet jede Zeile zu einem bestimmten Generator,   und der Wert-Spalte enthält die letzte   Primärschlüssel abgerufen. Die Persistenz-Provider   ordnet bis zu allocationSize 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 die initialValue 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

sein
-------------------------------------------------------------
| 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top