Zdravím.

Podařilo se mi konečně najít uspokojivé řešení toho, jak dostat data z databáze 
na formulář a zpět, bez nutnosti psát tuny kódy, tak se zde o ně podělím, abych 
se pořád jen neptal. Někomu možná pomůžu a někdo možná znáte způsob, jak to 
ještě vylepšit.

Používám JPA (Java Persistance API), pak JGoodies Binding. Poslední problém, 
který jsem měl bylo, že Binding vyžaduje aby získaná Entita (Java bean) měla 
tzv. "Bounded properties", tedy aby byla schopna oznamovat změnu svého stavu 
případným zájemcům, tedy aby byla "Observable". Řešení tohoto problému jsem 
našel zde:

1.) http://www.damnhandy.com/?page_id=17
2.) https://izvin.bountysource.com/ - Better bound properties management

Dvojka je podle mě lepší, protože potřebná knihovna má jen 200kB, na rozdíl od 
prvního řešení, kde má knihovna 2,4MB. První řešení zase ale umožňuje elegantní 
řešení pomoci anotací. Druhé vyžaduje doplnit do kódu volní jedné metody navíc.


Celé to pak vypadá takto (zkrácený kód):

//získání objektu zákazníka nebo vytvoření nového
//em je instance EntityManageru

 if (...)
     customer = new Customers();
 else
     customer = 
(Customers)em.createNamedQuery("Customers.findById").setParameter("id",buyer_id).getSingleResult();
    
// vytvoření provázání na formulář
// zde je ten kritický krok, kdy je potřeba pomoci UIBeanEnhancer.enhance() 
modifikovat získaný Bean, taky aby byl Observable

 customerPresentationModel = new 
PresentationModel(UIBeanEnhancer.enhance(customer));

// nyní se namapují jednotlivé prvky formuláře:
// tohle by šlo krásně vygenerovat automaticky pomoci Jackpot projektu v 
Netbeans, když se dodrží určité konvence pro pojmenování

 
Bindings.bind(itemc_bname,customerPresentationModel.getModel(Customers.ITEM_BNAME));
 
Bindings.bind(itemc_city,customerPresentationModel.getModel(Customers.ITEM_CITY));
 
Bindings.bind(itemc_ico,customerPresentationModel.getModel(Customers.ITEM_ICO));
 
Bindings.bind(itemc_dic,customerPresentationModel.getModel(Customers.ITEM_DIC));
 
Bindings.bind(itemc_email,customerPresentationModel.getModel(Customers.ITEM_EMAIL));
 ...

// no a nakonec je třeba zajistit, že když uživatel formulář zavře nebo klikne 
na Uložit, vrátí se data zpět to DB:

 EntityManagerUtil.persist(customer,em);
 em.close();

// EntityManagerUtil.persist je můj výmysl, abych nemusel moc psát:

    public static void persist(Object obj,EntityManager em) {
        try {
            em.getTransaction().begin();
            em.persist(obj);
            em.getTransaction().commit();
        } catch (Exception e) {
            em.getTransaction().rollback();
            em.close();
            throw new UnexpectedError(e);
        }
    }


To je vše. Dík za vaše názory ;-)   

   
Datum: 10:03:31    27. září 2006
-- 
---------------------------------------------------------------------
 Tomáš Procházka


 E-mail: [EMAIL PROTECTED]
    WWW: http://atom.sf.cz
    ICQ: 87147320
---------------------------------------------------------------------

Odpovedet emailem