Az adatbázis modelljének kezelése Liquiface-ben

Posted by | · · · | Liquiface | Nincs hozzászólás a(z) Az adatbázis modelljének kezelése Liquiface-ben bejegyzéshez

Liquibase relációs adatbázisok karbantartásához készült. Mivel a Liquiface egy GUI a Liquibase-hez, ezért az adatbázist mi is a relációs adatmodellre építve modellezzük.


  • A modell az alap (Model)
  • A modell táblákból áll (Table)
  • A táblának lehetnek oszlopai (Column)
  • A táblának lehet elsődleges kulcsa (PrimaryKeyConstraint)
  • A tábla idegen kulcsokkal hivatkozhat más táblákra (ForeignKeyConstraint)
  • A táblában lehetnek egyediségre vonatkozó megszorítások (UniqueConstraint)

model_classes

A Liquibase API-ban minden elemi adatbázis változást a Change interfész egy implementációjával adhatunk meg. Egy Change elemi, mert már nem bontható tovább önállóan értelmezhető egységekre. Tehát elmondható, hogy a Liquibase Change alapú, minden egyes módosítás egy Change összerakását jelenti. A Change-ekből ChangeSet-ek építhetők, de ez már csak a csoportosítás kérdése, ezért az alábbiakban ezzel nem is foglalkozunk.

Íme néhány gyakran használt Change implementáció:

  • CreateTableChange
  • AddColumnChange
  • DropTableChange
  • AddPrimaryKeyChange
  • RenameTableChange

Ha minden a Change-ekre épül, akkor a modell karbantartását is kézenfekvő Change alapokon megoldani. Ez részletesen a következőket jelenti:

  • A Liquiface induláskor mindig egy üres modellből indul ki
  • Ezt követően a modellt a Change-ek sorozatából, lépésenként építjük fel
  • Egy elemi lépés egy Change alkalmazása a modellre
  • Ha adatbázisból vagy changelog fájlból töltjük be a modellt, akkor a Change-eket ezekből olvassuk be (valójában mindig fájlból jönnek a Change-ek, mert az adatbázis szerkezetét is fájlba generáljuk beolvasáskor)
  • Ha a felhasználó a felületen módosít valamit a modellen, akkor a háttérben ott is egy Change-et rak össze egy wizard segítségével, majd ezt a Change-et alkalmazzuk a modellen.
Egy Change alkalmazását a modellen úgy oldottuk meg, hogy definiáltunk egy ChangeApplier interfészt:

public interface ChangeApplier {
    void apply(Model model, Change change);
}

A ChangeApplier interfésznek minden egyes általunk kezelt Change típusra elkészítettük az implementációját. Például a AddColumnChange-nek az AddColumnChangeApplier implementáció felel meg. Ezekben az implementációkban írjuk meg, hogy az adott változást hogyan alkalmazzuk a modellen.

@ApplyChange(AddColumnChange.class)
public class AddColumnChangeApplier implements ChangeApplier {
   @Override
   public void apply(Model model, Change c) {
       // Itt a programkód, ami egy új oszlopot hozzáad az adott táblához
   }
}

Már csak azt kell megoldani, hogy minden Change típushoz megtaláljuk a megfelelő ChangeApplier-t. Erre való az @ApplyChange annotáció, ahol megadjuk, hogy az adott ChangeApplier melyik Change osztályra vonatkozik. A megfelelő ChangeApplier lookup-jának leprogramozásához csináltunk egy ChangeApplierProvider interfészt, ami minden Change-hez visszaadja a megfelelő ChangeApplier példányt:

public interface ChangeApplierProvider {
    ChangeApplier getApplier(Change change) throws Exception;
}

Ennek egy implementációjában használjuk fel az @ApplyChange annotáció-ban megadott értéket a Change-ek és ChangeApplier-ek párosítására.


No Comments

Leave a comment