Wichtig
Kleinigkeit
Fehlerbehebung
Wichtig
Während der Migration kann es notwendig werden neue persistente Objekte zu erzeugen. Dafür benötigt man eine KnowledgeBase ID für das neue Objekt. Diese ID darf in den bisher migrierten Revisionen noch nicht verwendet worden sein. Und sie darf auch in den noch zu migrierenden Revisionen nicht verwendet worden sein. Es soll eine Möglichkeit geben eine solche ID zu erzeugen.
Verwendung
Zusammenfassung
Man kann sich jetzt für die Migration eine IdFactory injizieren lassen.
Hintergrund
Die automatische Datenmigration verwendet Migrations-XML-Dateien, die die einzelnen Schritte der Migration beschreiben. Dabei handelt es sich um eine Konfiguration]: com.top_logic.knowledge.service.migration.MigrationConfig. (Es gibt leider zwei Config-Interfaces mit dem Namen MigrationConfig, daher der qualifizierte Name.) In dieser werden zum Beispiel MigrationProcessor und com.top_logic.knowledge.service.db2.migration.config.MigrationConfig konfiguriert. Für die Instanziierung wird ein spezieller InstantiationContext verwendet, der Dependency Injection mittels Guice] unterstützt. Dadurch kann jede Instanz, die während des Einlesens einer Migrations-XML-Datei erstellt wird, sich von Guice Dependencies injizieren lassen: {{{#!java @Inject public void initIdFactory(IdFactory idFactory) {
_idFactory = idFactory;
} }}} Das ist unabhängig davon, ob es sich um ein EventRewriter, einen MigrationProcessor oder ein Predicate handelt, dass irgendwo innendrin in einer anderen ConfiguredInstance vorkommt. (Für weitere Beispiele kann man im Workspace nach den Verwendungen von com.google.inject.Inject suchen.)
Um neue IDs zu erzeugen, benötigt man die oben erwähnte IdFactory. Diese kann man zum Beispiel in einem EventRewriter verwenden, um in einem ChangeSet eine zusätzliche ObjectCreation anzulegen: {{{#!java public class ExampleRewriter implements EventRewriter {
@Inject
public void initIdFactory(IdFactory idFactory) {
_idFactory = idFactory;
}
@Override
public void rewrite(ChangeSet changeSet, EventWriter out) {
...
TLID newId = LongID.valueOf(_idFactory.createId());
ObjectBranchId objectBranchId = new ObjectBranchId(branchId , metaObject, newId);
ObjectCreation newCreation = new ObjectCreation(changeSet.getRevision(), objectBranchId);
changeSet.getCreations().add(newCreation);
out.write(changeSet);
}
} }}}
Technische Umsetzung
Während des Einlesens der zu migrierenden KnowledgeBase wird deren letzte ID ermitteln. Diese wird benutzt um zu Beginn der Migration eine IdFactory zu initialisieren.
Test
Kein Test.