2015-04-18

Tvorba indexů v Ujorm 1.56

Nová verze Ujorm 1.56 nabízí rozšířené možnosti tvorby databázových indexů pomocí anotace @Column (umístěné nad klíčem typu Key<A,B>) se dvěma metodami:
  • index()
  • uniqueIndex()
kde argumentem metod může být nově seznam indexů. Pokud se index jednoho jména vyskytuje v několika anotacích, vznikne kompozitní index.

Příklad použití:
   private static final String IDX_STATE_COUNT = "idx_state_count";
   private static final String IDX_COUNT = "idx_count";

   @Column(index = IDX_STATE_COUNT)
   public static final Key STATE = newKey();

   @Column(index = {IDX_STATE_COUNT, IDX_COUNT})
   public static final Key COUNT = newKey();

Databázový sloupec COUNT tedy bude obsažen ve dvou různých indexech, z toho jeden bude kompozitní.

Aby vznikl unikátní kompozitní index, musí být jeho jméno vloženo vždy metodou uniqueIndex(). Pořadí sloupců v kompozitním klíči je určeno pořadím Klíčů. Pokud budeme potřebovat jiné pořadí, můžeme použít rozšířenou implementaci třídy pro sestavení indexů z frameworku Ujorm, která akceptuje pořadí sloupce (v kompozitním indexu), které se vkládá za název indexu. Výchozí hodnota je 10, dva sloupce se stejným číslem pak kopírují pořadí Klíče. Ukázka použití je tady:
   private static final String IDX_STATE_COUNT = "idx_state_count";

   @Column(index = IDX_STATE_NOTE + "#30")
   public static final Key STATE = newKey();

   @Column(index = IDX_STATE_NOTE + "#20")
   public static final Key COUNT = newKey();

Rozšířenou implementaci třídy pro sestavení indexů lze nakonfigurovat (v době sestavení meta-modelu) příkazem:
   MetaParams params = new MetaParams();
   params.set(MetaParams.INDEX_MODEL_BUILDER, IndexModelOrderedBuilder.class);
   ormHandler.config(params);

Je zřejmé, že parametr INDEX_MODEL_BUILDER může referencovat také vlastní implementaci, která pak může sestavovat model indexů podle úplně jiných pravidel a anotací. Specifické požadavky lze potom řešit zcela mimo framework Ujorm.

2015-02-19

2014-03-24

Key-value programování v jazyce Java

Ujorm je knihovna postavená na key-value architektuře doménových objektů, které přistupují ke svým atributům pomocí tak zvaných Klíčů. Na několika krátkých příkladech bych rád demonstroval zajímavé či nové vlastnosti jádra frameworku Ujorm verze 1.45.

Odkaz na celý článek:
http://ujorm.org/sample/key-value-cz.html

Obsah:
  • Zápis a čtení hodnot
  • Obnovení defaultních hodnot
  • Mělká kopie objektu
  • Validace atributů při zápisu
  • Kompozitní Klíče
  • Criterion jako popis podmínky
  • Criterion pro filtrování kolekce
  • Řazení kolekcí
  • Import CSV formátu

2014-03-11

Ujorm verze 1.44

V Maven repozitářích je k dispozici nová verze Ujorm, která obsahuje dlouho očekávanou podporu pro tvorbu hierarchických dotazů, ve kterých se cizí relace databázové tabulky odkazují na sama sebe. Dříve bylo nutné pro tento typ dotazů používat nativní SQL příkazy, nově lze tyto dotazy modelovat pomocí Ujorm klíčů typu relace, za které se vkládá alias referencované tabulky. Ukázka použití je demonstrována na dotazu, který vyhledá všechny zákazníky s příjmenín "Brown" a s prarodičem "Smith":


     Criterion<Customer> crn1, crn2, crn3;
     crn1 = Customer.PARENT.alias("parent1")
       .add(Customer.PARENT).alias("parent2")
       .add(Customer.SURENAME)
       .whereEq("Smith");
     crn2 = Customer.SURENAME.whereEq("Brown");
     crn3 = crn1.and(crn2);


     Customer customer = session.createQuery(crn3).uniqueResult();


Uvedený Aliasy lze vyuźít také v případech, kdy jedna entita obsahuje více relací na stejnou entitu, příkladem mohou být dvěr relace Person.MOTHER, Person.FATHER.


Mezi další novinky Ujorm řady 1.4x patří:
  • XML konfiguraci ORM meta-modelu lze validovat pomocí XSD souboru
  • k dispozici je nový modul (ujo-xsd) pro generování XSD souborů podle UJO třídy
  • ORM podporuje alternativně nativní DB sekvence pomocí třídy NativeDbSequencer
  • ORM lazy loading je možné povolit volitelně na uzavřené session, v takových případech se otevírá nová DB connection na nezbytně nutnou dobu
  • došlo k odstranění zastaralého interface UjoProperty, který byl od verze 1.30 deprecated a by nahrazen novým interfacem Key (včetně souvisejících metod)

Podrobnějśí popis změn je v release notes.

2013-09-09

Demo aplikace pro Ujorm a Wicket

Knihovna Ujorm byla představena na portálu java.cz v roce 2007, tehdy ještě pod starým názvem UJO Framework. Od té doby uběhlo 6 let a zdrojový kód prošel mnoha úpravami, základní myšlenka však zůstala stejná: přístup k vlastnostem objektu se provádí pomocí konstant zvaných klíče.

Pro prezentaci knihovny Ujorm jsem se rozhodl připravit malý webový projekt, který provádí rezervaci hotelů. Grafické rozhraní vykresluje framework Apache Wicket, jádrem aplikace jsou přehledové tabulky a editační dialogy, pro přístup k databázi se využívá ORM modul projektu Ujorm.
Pro ilustraci přikládám screenshot editačního dialogu a odpovídajícího zdrojového kódu:





Detailní článek k demo aplikaci je k dispozici zde.

2013-01-20

Ujorm verze 1.32

Byla uvolněna nová verze Ujorm 1.32 obsahující nové Validátory a v modulu ORM možnost načtení relačních databázových tabulek jediným SQL dotazem. Více informací je v anglické verzi tohoto oznámení.

2012-12-11

Generátor getterů pro NetBeans

V repozitáři SourceForge je připraven ke stažení nový open-source pluggin určený pro IDE NetBeans 7.2, který slouží pro generování getterů a setterů UJO objektů podle jeho Klíčů. Pro ilustraci přikládám několik screenshotů:

1. Pro instalaci plugginu je třeba nejdříve stáhnout soubor typu "nbm" ze SourceForge do lokálního adresáře a pomocí NB-Pluggin manageru nainstalovat:




2. Nový pluggin pak najdeme v kontextovém menu, které se používá také pro generování getterů a setterů běžných JavaBeans:




3. Dialog umožňuje vybrat klíče, pro které se mají vytvořit gettery a settery. Poslední volba dole pod seznamem klíčů umožňuje zkopíruje také JavaDoc:



4. Výsledek: generovaný kód se bude podobat následující ukázce:



Za tento pluggin patří poděkování jeho autorovi Martinovi Mahrovi.

2012-11-27

Pokyny k migraci do Ujorm 1.30

Pokud zvažujete migraci do Ujorm 1.30, doporučuji použít tři jednoduché kroky:
  1. v Maven projektech upravte závislost na: groupId=org.ujorm + version=1.30
  2. nahraďte všechny texty "UjoProperty" za cílové "Key" ve vašem projektu a
  3. opravte použití metod označených jako @Deprecated
Volitelně lze nahradit použití statických továrních metod pro tvorbu klíčů za vhodnější použití třídy KeyFactory.

Doplněno 09.12.2012: po zkušenostech s několika projekty doporučuji porovnat popisy perzistentního meta-modelu před a po migraci. Úplný popis meta-modelu ve formátu XML se zapisuje do logu aplikace vždy po startu ORM. Pokud bude migrace  ok, budou obě verze identické. Tímto přístupem lze odhalit nejen překlepy v názvech klíčů UJO objektu.

2012-10-23

Ujorm verze 1.30


Po delší přestávce byla uvolněna verze Ujorm 1.30, která obsahuje několik důležitých změn v API, kde na prvním místě je třeba zmínit přejmenováni původního interface UjoProperty za nový název Key. Ten původní interface zůstal zachovaný jako @Deprecated, názvy implementačních tříd zůstávají. Důvody byly následující:
  • původní název UjoProperty byl trochu zavádějící a pro jeho neměnnou vlastnost a tak občas bylo obtížnější vysvětlit jeho význam. Nový název vychází z běžného pojmenování parametrů interface java.util.Map .
  • původní název byl dlouhý a tím hůře čitelný ve zdrojovém kódu
  • v poslední době vzniklo několik nových tříd, které se od názvu klíče (Property) odvíjí a bylo užitečné toto rozhodnutí urychlit, jedná se konkrétně o třídy KeyRing a KeyFactory.

Nový KeyRing slouží jako serializovatelná kolekce klíčů - protože klíče samy o sobě serializovatelné být nemohou - přišly by totiž o vlastnost unikátní instance v rámci class-loaderlu. Potřeba serializovat klíče může být v některých případech nezbytná, konkrétní příklad využití je ve Wicket frameworku.

Další nová třída třída se jmenuje KeyFactory a je určena k výrobě objektů typu Key. Výhodou továrny je, že ji lze použít i pro statické konstanty nějakého Interface. Užitečnou vlastností může být automatický tvorba názvu klíčů podle názvu jeho fieldu s volitelnou možností konverze jména na camel-case. Nově také není potřeba při tvorbě klíče posílat jeho datový typ parametrem, framework umí tento atributy získat z meta-modelu fieldů v době uzamčení továrny (případně při prvním načtení klíčů). Každý takový klíč obsahuje teď nový atribut své doménové třídy. Ukázka použití:

public class Person extends AbstractUjo {
  private static final KeyFactory f = newFactory(Person.class);
   
  public static final Key<Person,String > NAME = f.newKey();
  public static final Key<Person,Boolean> MALE = f.newKey();
  public static final Key<Person,Double > CASH = f.newKey();
   
  @Override public KeyList<?> readKeys() {
    return f.getKeys();
  }
}


Framework nabízí nový, zjednodušený klíč zvaný WeakKey, který neobsahuje doménový generický parametr. Jeho využití se nabízí jako náhrada konstant pro práci s objekty typu Map, List, případně pro čtení parametrů z objektu HttpRequest, kde provádí konverzi na požadovaný typ. Instance se pak vytváří pomocí WeakKeyFactory.

Framework je možné připojit do Maven projektu pomocí závislosti:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-core</artifactId>
    <version>1.30</version>
</dependency>


a pro případ využití ORM:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-orm</artifactId>
    <version>1.30</version>
</dependency>



Pro použití UJO objektů ve frameworku Wicket bude potřebná implementace třídy KeyModel, která je analogií ke standardní implementaci Wicket třídy PropertyModel. Třídu je možné získat pomocí závislosti:

<dependency>
    <groupId>org.ujorm</groupId>
    <artifactId>ujo-wicket/artifactId>
    <version>1.30</version>
</dependency>


Tento modul neobsahuje rozsáhlé služby, přesto přikládám pro inspiraci vytvoření jednoduché tabulky:

 List<ICellPopulator> columns = KeyPopulator.list
    ( Employee.ID
    , Employee.FIRSTNAME
    , Employee.LASTNAME
    , Employee.ADDRESS.add(Address.CITY)
    );

 final WebMarkupContainer table = new WebMarkupContainer("table");
 final DataGridView grid = new DataGridView("gridPanel", columns,

       new  InnerPeopleProvicer());
 table.setOutputMarkupId(true);
 grid.setItemsPerPage(20);
 add(table);
 table.add(grid);
 add(new AjaxPagingNavigator("tableNavigator", grid));


Za významnější změny API se všem uživatelům frameworku omlouvám, změny však byly nezbytné pro další rozvoj této knihovny.

V případě zájmu lze najít více informací najít v