dotaz k SOAPHandler - xmlns=""

2017-03-29 Tema obsahu Miroslav Paulfranc
Dobrý den
Narazil jsem na jeden problém, týkající se webové služby, konkrétně
klientské strany a standardních tříd Javy.
Na straně serveru webové služby používám spring.

Jde o to, že když v JDK8 vygeneruji pomocí wsimport klientskou část, funguje
vše jak má.

Když ale přidám na klientovi handler SOAPHandler , tak
stačí, abych v metodě

public boolean handleMessage(SOAPMessageContext context)

zavolal context.getMessage(); - tj. pouze getter, nic víc a volání webové
služby končí s chybou na serveru.

To je způsobeno tím, že zavolání context.getMessage(); způsobí to, že do
SOAP dat se vloží atribut xmlns="" a s tím má pak server problém.

Přijde mi, že u tak základní funkcionality ve standardních třídách Javy není
možné, aby jen zavolání getteru způsobilo takovouto změnu dat a následující
chybu na serveru.

Jen na okraj - handler bych chtěl použít pouze pro čtení zprávy (chci zprávy
vždy ukládat do DB a podle potřeb volat WS buď okamžitě po uložení, nebo
později, případně volání opakovat, pokud dojde k nějaké chybě).

Je možné, že už jste se někdo s podobným problémem setkal.

Předem děkuji za případné tipy! (Už jsem samozřejmě googlil.)
M.Paulfranc


Re: dotaz - Java - DB objekty

2015-04-17 Tema obsahu Miroslav Paulfranc
Předně děkuji za reakci.
Také používám klíč, ale nejsem si jistý, zda by nebyl lepší nějaký kód. 
Pokud se klíč změní např. na složený klíč, promítne se změna do celé 
aplikace (to je asi to nejmenší), klíč je nějaké náhodně vygenerované 
číslo (na které pak vážu logiku aplikace), které se musí udržovat na všech 
instancích stejné (jak jste také zmínil) a které nic neříká o vlastním 
zpracování, pokud by se použil kód, může se několik typů zpracovávat stejným
způsobem - dle kódu, zpracování se může měnit - např. se prohodí způsob 
zpracování u dvou typů apod., dále může kód být např. nějakou kombinací 
zpracování u čísla  - co bit, to nějaký způsob apod.
Takže váhám.
Ale děkuji za reakci

Používám Hibernate a k dotahování typu (resp. ekvivalentu) stejně dochází, 
takže join navíc už tam je.


-- Původní zpráva --
Od: Ondra Medek xmed...@gmail.com
Komu: Programovací jazyk JAVA konference@java.cz
Datum: 17. 4. 2015 14:39:17
Předmět: Re: dotaz - Java - DB objekty









Ahoj,

jestli to dobře chápu, pak Type je nějaký číselník


public class Type {

    long id; // umely klic

    String code; // prirozeny klic
}


Tedy jde o to, jestli kód větvit podle umělého klíče nebo přirozeného. V 
praxi jsme se setkal s oběma přístupy:



- větvení podle umělého klíče id - nemusí se načítat záznam Type, stačí 
mít Record.type_id. Je ale potřeba zajistit stejný umělý klíč na všech 
prostředích (vývoj, test, produkce). Což může být někdy trochu problém.

- větvení podle přirozeného klíče je více robusní, není zde problém se 
synchronizací prostředí. Ale musí se načítat (join, select navíc) i z 
tabulky typu. Případně se načítání dá vyhnout použitím cache (Hibernate 2nd 
level cache).



Já bych spíše použil přístup přes přirozený klíč s využitím Hibernate 2nd 
level cache. Většinou dávám do aplikace nějaké tlačítko pro administrátora 
pro mazání Hibernate 2nd level cache pro administrátora pro případ, kdy se 
DB tabulky mění mimo aplikaci.










Ondra Medek




2015-04-17 12:41 GMT+02:00 Miroslav Paulfranc paul...@seznam.cz
(mailto:paul...@seznam.cz):

Zdravím všechny přítomné
Měl bych spíše obecnější dotaz, který nesouvisí pouze s Javou, nicméně 
předpokládám, že i při psaní kódu v Javě podobnou věc velmi často řešíte.

Dejme tomu, že máte databázové objekty, u kterých chcete nějaké číselné 
identifikátory (autoincr., identity..,) a máte např.nějaký objekt typu
Record a ten je nějakého typu, např. Type, takže databáze s 2 tabulkami 
Record a Type (přičemž každý záznam typu Record má referenci na Type).

Pak chcete záznamy typu Record v aplikaci nějak zpracovávat podle toho, 
jakého jsou Typu.
Máte např. nějaký přepínač (switch(...)), který něco dělá s Recordem podle 
jeho Typu.

Používáte v přepínači klíč Typu, nebo si vytváříte nějaké speciální pole 
(něco jako TYPE_CODE), podle kterého pak záznamy v aplikaci zpracováváte?
Tj. v přepínači nebo nějakém if-u bude if(type.getId()==něco) , nebo radši 
použijete nějaký k tomu určený atribut?

Napadají mě důvody pro použití i nepoužití prvního i druhého způsobu; máte 
prosím někdo nějaký tip, proč preferovat přístup s klíčem nebo nějaký jiný 
přístup, ideálně odkaz na nějaké články, které by se tímto zabývali, 
případně jak to řeší nějaké populární aplikace?

Předem děkuji za tipy.

S pozdravem
M.Paulfranc









dotaz - Java - DB objekty

2015-04-17 Tema obsahu Miroslav Paulfranc
Zdravím všechny přítomné
Měl bych spíše obecnější dotaz, který nesouvisí pouze s Javou, nicméně 
předpokládám, že i při psaní kódu v Javě podobnou věc velmi často řešíte.

Dejme tomu, že máte databázové objekty, u kterých chcete nějaké číselné 
identifikátory (autoincr., identity..,) a máte např.nějaký objekt typu
Record a ten je nějakého typu, např. Type, takže databáze s 2 tabulkami 
Record a Type (přičemž každý záznam typu Record má referenci na Type).

Pak chcete záznamy typu Record v aplikaci nějak zpracovávat podle toho, 
jakého jsou Typu.
Máte např. nějaký přepínač (switch(...)), který něco dělá s Recordem podle 
jeho Typu.

Používáte v přepínači klíč Typu, nebo si vytváříte nějaké speciální pole 
(něco jako TYPE_CODE), podle kterého pak záznamy v aplikaci zpracováváte?
Tj. v přepínači nebo nějakém if-u bude if(type.getId()==něco) , nebo radši 
použijete nějaký k tomu určený atribut?

Napadají mě důvody pro použití i nepoužití prvního i druhého způsobu; máte 
prosím někdo nějaký tip, proč preferovat přístup s klíčem nebo nějaký jiný 
přístup, ideálně odkaz na nějaké články, které by se tímto zabývali, 
případně jak to řeší nějaké populární aplikace?

Předem děkuji za tipy.

S pozdravem
M.Paulfranc




dotaz JSF

2014-09-24 Tema obsahu Miroslav Paulfranc
Zdravím všechny přítomné

Měl bych dotaz týkající se JSF - composite component.

Dejme tomu, že mám následující komponentu:

cc:interface componentType=PopupWindowController
    cc:attribute name=title required=false /
/cc:interface

cc:implementation
...
/cc:implementation

Tušíte někdo, zda lze vytvořit potomka této komponenty, tzn. vytvořit 
komponentu, která bude mít v elementu cc:implementation něco navíc
a  componentType=ExtendedPopupWindowController , přičemž třída 
ExtendedPopupWindowController bude potomkem PopupWindowController (možná to 
jde obejít použitím šablon, ale preferoval bych nějaké lepší řešení)?

Předem děkuji za tipy.
S pozdravem
Miroslav Paulfranc


jsf X JSTL

2014-06-26 Tema obsahu Miroslav Paulfranc
Zdravím všechny přítomné.

Mám trochu problém s JSF (impl. com.sun.*) a s používáním knihovny jstl.
Tomu, že se vyhodnocují např. atributy rendered
h:panelGrid rendered=#{inputBean.value!=null} 
 z knihovny xmlns:h=http://java.sun.com/jsf/html; 
a podmínka  c:if test=#{inputBean.value!=null} xmlns:c=http://java.sun.
com/jsp/jstl/core v jiné fázi jsem se přizpůsobil,
ale narazil jsem na problém s partial renderingem u ajaxu.

Níže uvedený kód funguje tak, jak potřebuji - při ajax submitu se pracuje 
jen s managed beanou ajaxBean,
ale pokud podmínku
h:panelGrid rendered=#{inputBean.value!=null}
nahradím podmínkou
c:if test=#{inputBean.value!=null}
, začne se při ajax submitu vytvářet a vyhodnocovat  i managed beana 
inputBean - což při jiném způsobu vyhodnocování u knihovny jstl chápu, ale
což nechci a co může za jiných okolností způsobovat chybu.

Můj dotaz je následující.

1.Používáte někdo např. knihovnu s obdobnou funkcionalitou jako jstl, která 
by ale vyhodnocování prováděla v jiné fázi ( tak jako vyhodnocení 
např. h:panelGrid rendered=#{inputBean.value!=null})? 

případně

2. Používáte jiný způsob, jak podmíněně renderovat bloky bez použití 
komponent, které by cokoliv(div,span) renderovaly (tj. bez h:panelGrid apod.
a bez f:subview), dále náhradu jstl elementu c:set  c:set target=#
{formBean} property=onEdit value=#{true} / - pokud možno bez vytváření
vlastních custom composite component, které by řešily jen tohle (tj., 
nějakým jednoduchým a běžným způsobem)?


Předem děkuji za odpovědi!
M.Paulfranc
/**/

!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN
  http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd;
html xmlns=http://www.w3.org/1999/xhtml; xmlns:ui=http://java.sun.com/
jsf/facelets
    xmlns:h=http://java.sun.com/jsf/html; xmlns:f=http://java.sun.com/jsf/
core xmlns:a4j=http://richfaces.org/a4j;
    xmlns:rich=http://richfaces.org/rich;

f:view
    h:head
        titleJSF-TEST/title
    /h:head

    h:body

        h:form
   !-- AJAX --
            h:inputText value=#{ajaxBean.value} id=idAjaxInput /
            h:commandButton value=Submit
                f:ajax event=click render=idAjaxOutput execute=
idAjaxInput /
            /h:commandButton
            h:outputText value=#{ajaxBean.value} id=idAjaxOutput /

    !-- SUBMIT --
         h:panelGrid rendered=#{inputBean.value!=null}
                h:outputText value=#{inputBean.value} /
                h:inputText value=#{inputBean.value} /
                h:commandButton action=#{inputBean.submit} value=Send /

            /h:panelGrid

        /h:form
    /h:body
/f:view
/html


Re: Hibernate SELECT bez FROM tabuľky

2013-06-28 Tema obsahu Miroslav Paulfranc
Zdravím.
Pracuji s něčím velmi podobným.
Mám master tabulku s detaily, přičemž detail má rozsah platnosti (2 x čas) 
validFrom a validTo (asi souvisí s předchozí poznámkou o normalizaci).
Když vytahuju aktuální data, tahám primárně z tabulky master + 
DetachedCriteria.LEFT_JOIN  na data s podmínkou, že validTo = null (pro 
aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez 
problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle
požadovaného data (jedním sql dotazem).

Myslím, že to, co chcete přes Criteria API určitě nějak půjde. 

Pokud by vám nevadilo trochu upravit hbm map. soubor, tak můžete udělat to 
samé s podmínkou pro konec, necháte řadit podle detail_time
a v mapování řeknete, že chcete v kolekci dotahovat pouze jednu položku, 
otázka je, jestli vám tohle omezení nebude vadit jinde (navíc je možné, že 
hib. bude generovat víc sql dotazů - asi min. 2, záleží i na fetch mode - 
select/join ).

M.P.



-- Původní zpráva --
Od: Rastislav Siekel sie...@prosoft.sk
Datum: 27. 6. 2013
Předmět: Hibernate SELECT bez FROM tabuľky


Zdravím vospolok,

chcel by som sa spýtať, či niekto neriešil nasledujúci problém:

V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť 
posledný detail, čo spravím v SQL takto:

... AND detail_id = 
(
    SELECT * FROM
    (
        SELECT detail_id
        FROM detail
        ORDER BY detail_time DESC
    )
    WHERE rownum = 1
)
...


Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie 
spraviť SELECT FROM (...) WHERE 
Aj DetachedCriteria, aj Criteria si vyžadujú Entitu (DTO), nad ktorou 
pripravia SQL príkaz. Je nejaká možnosť ako toto obísť?

Vďaka,
Rastislav Bedo Siekel




Ing. Rastislav Siekel 
Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia 
E-mail : sie...@prosoft.sk (mailto:sie...@prosoft.sk) 
Tel : 041/562 54 91 
Fax : 041/562 54 97 
Mobil : 0905 34 00 20 







Re: Hibernate SELECT bez FROM tabuľky

2013-06-28 Tema obsahu Miroslav Paulfranc
Jestli vám vadí vyloženě to, že dostanete kolekci místo objektu (napr. kvuli
pouzivani gener. pojo objektu v jsf, velocity sablonach apod.), 
tak pokud to máte tímto způsobem dělané všude,
můžete generovat pojo objekty tak, že generované třídy budou dědit z třídy, 
kde bude metoda pro natažení prvního prvku kolekce a zároveň budete 
generovat předky vámi napsané třídy.

Tj. 

Třída použitá jako předek pro generované objekty:
==
class Predek {

 protected Object  getFirstObjectFromCollection(Collection col){
 /** vratit prvni objekt jak potrebujete - staci jen  col.iterator().next();
*/
 }
}

==
generovana trida 

class ZaznamMasterBase {
  
...
 
 public SetZaznamData getZaznamDatas(){
...
}

}

==
vami napsany potomek

class Zaznam {


/** tohle je jediny kod, ktery musite doplnit rucne, jinak se pri zmene vse 
generuje beznym zpusobem **/
public ZaznamData getZaznam(){
return  (ZaznamData getFirstObjectFromCollection( getZaznamDatas() );
}

}

Tento zpusob pak pouzivam nejak takhle:



DetachedCriteria criteria = DetachedCriteria.forClass(Zaznam.class);
criteria.createAlias(zaznamDatas, zaznamData, DetachedCriteria.LEFT_
JOIN);
criteria.createAlias(zaznamData.vt, stav, DetachedCriteria.LEFT_JOIN);

/** pokud chci napr. nejaky objekt, na ktery odkazujue zaznamData - napr 
stav  */
criteria.createAlias(zaznamData.stav, stav, DetachedCriteria.LEFT_JOIN);

add(Restrictions.isNull(zaznamData.vt)); //aktualni zaznam validTo = null

Pak napr..
 ListZaznam zaznam = (ListZaznam) getHibernateTemplate().findByCriteria
(criteria);

v tu chvili  pouzije jeden jednoduchy sql dotaz, jehoz vysledkem bude seznam
z master tabulky s aktualnimi daty vcetne stavu.

V iteraci se pak da volat 

zaznam.getZaznamData().getStav()... 

Takhle se da pracovat i s objekty a hbm. mapovanim generovanym z databaze 
(tj. bez moznosti zasahovat do hbm mapovani).
Pokud se dodrzi urcita jmena konvence, da se podminka na aktualni data dat 
nekam do predka a pak staci jen neco jako kod nize.

Vyber aktualnich zaznamu KpDatCloseDate vcetne dalsich referencovanych 
objektu vypada napr. takhle:

ExtendedDetachedCriteria criteria = ExtendedDetachedCriteria.forClass
(KpDatCloseDate.class);
criteria.includeObject(perioda);
criteria.includeObject(spolecnost);

spousteny generovany sql dotaz je pak velmi jednoduchy a je jen jeden










-- Původní zpráva --
Od: Rastislav Siekel sie...@prosoft.sk
Datum: 28. 6. 2013
Předmět: Re: Hibernate SELECT bez FROM tabuľky



Ahoj,

 Když vytahuju aktuální data, tahám primárně z tabulky master + 
DetachedCriteria.LEFT_JOIN  na data s podmínkou, že validTo = null (pro 
aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez 
problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle
požadovaného data (jedním sql dotazem).

To je ten problém - ...dostanu master záznam + kolekce detailu... - a potom 
podmienka na detail nie je podmienka na posledný detail ale na kolekciu 
detailov...

Rastislav Bedo Siekel




Ing. Rastislav Siekel 
Prosoft s.r.o., Kuzmányho 8, 010 01 Žilina, Slovakia 
E-mail : sie...@prosoft.sk (mailto:sie...@prosoft.sk) 
Tel : 041/562 54 91 
Fax : 041/562 54 97 
Mobil : 0905 34 00 20 




On 28. 6. 2013 9:48, Miroslav Paulfranc wrote:

Zdravím.
Pracuji s něčím velmi podobným.
Mám master tabulku s detaily, přičemž detail má rozsah platnosti (2 x čas) 
validFrom a validTo (asi souvisí s předchozí poznámkou o normalizaci).
Když vytahuju aktuální data, tahám primárně z tabulky master + 
DetachedCriteria.LEFT_JOIN  na data s podmínkou, že validTo = null (pro 
aktuální záznam) nebo s intervalem pro nějaký čas. Funguje to naprosto bez 
problému, vždy dostanu master záznam + kolekce detailu s jednou položkou dle
požadovaného data (jedním sql dotazem).

Myslím, že to, co chcete přes Criteria API určitě nějak půjde. 

Pokud by vám nevadilo trochu upravit hbm map. soubor, tak můžete udělat to 
samé s podmínkou pro konec, necháte řadit podle detail_time
a v mapování řeknete, že chcete v kolekci dotahovat pouze jednu položku, 
otázka je, jestli vám tohle omezení nebude vadit jinde (navíc je možné, že 
hib. bude generovat víc sql dotazů - asi min. 2, záleží i na fetch mode - 
select/join ).

M.P.



-- Původní zpráva --
Od: Rastislav Siekel sie...@prosoft.sk(mailto:sie...@prosoft.sk)
Datum: 27. 6. 2013
Předmět: Hibernate SELECT bez FROM tabuľky

 
Zdravím vospolok,

chcel by som sa spýtať, či niekto neriešil nasledujúci problém:

V Oracle mám tabuľky master a detail. Mám master a chcem k nemu nájsť 
posledný detail, čo spravím v SQL takto:

... AND detail_id = 
(
    SELECT * FROM
    (
        SELECT detail_id
        FROM detail
        ORDER BY detail_time DESC
    )
    WHERE rownum = 1
)
...


Tu som narazil na problém, že Hibernate pomocou Criteria API asi nevie 
spraviť

hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
Zdravím všechny přítomné.
Narazil jsme v Hibernate (3.6 a 4.0) na problém týkající se Criteria API - 
konkrétně jde o dotahování objektu s kolekcí.

Situace je následující:
Mám dejme tomu třídu Person a ta má kolekci Permissions, která je v hbm 
označena jako lazy loaded (lazy=true).

Pokud chci jedním SQL dotazem načíst osobu s kolekcí oprávnění, použiji:

DetachedCriteria criteria = DetachedCriteria.forClass(Person .class, 
person);
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN);

objekt třídy Person je potom natažen v rámci jednoho SQL dotazu včetně 
Permissions.

Pokud chci do podmínky k části join cokoliv přidat (např. omezit na platné 
perm. kde validDateTo=null),  použiju metodu


DetachedCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html)
 createCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria%28java.lang.String,%20java.lang.String,%20int,%20org.hibernate.criterion.Criterion%29)
(String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 associationPath, String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 alias, int joinType, Criterion
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/Criterion.html)
 withClause)


tj.
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN, nějakáPodmínka);

,pak je generován SQL dotaz přesně tak, jak bych čekal 
(dotaz z konkrétní aplikace: left outer join dbo.zadost_data zadostdata1_ on
this_.zadost_id=zadostdata1_.zadost_id and ( zadostdata1_.vt is not null ))
, ale bohužel se nedotáhne kolekce permissions a pokus o přečtení končí
výjimkou LazyInitializationException..

Zkoušel jsem i nastavovat fetchMode ale bez úspěchu..

Ověřoval jsem na několika aplikacích a všude se stejným výsledkem.

Metoda s parametrem Criterion byla přidána relativně nedávno (v 3.2. 
myslím nebyla).

Připadá mi, že pokud přidám withClause, ignoruje se potom fetch mode.
Tušíte prosím, jestli se dá přidat do join části nějakým jiným způsobem 
další podmínka?

Mimochodem; např. v Hibernate  třídě JoinWalker jsou variace na podmínku


if ( oj.getJoinType()==JoinType.LEFT_OUTER_JOIN   ! oj.hasRestriction() ) 
{
                    //it must be a collection fetch
                    collectionPersisters[j] = collPersister;
                    collectionOwners[j] = oj.getOwner(associations);
                    j++;
                }

kde hasRestriction indikuje použití podmínky withClause, tak nevím, jestli 
to nemůže souviset s tímto problémem..

Předem děkuji za odpověd.
M.P.









Re: hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
Ahoj.
 tak by se kolekce permissions vrátila jen napůl plná  - to je to, co 
potřebuju, nechci všechny permissions.

SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená.

Chci všechny Person, které mají Permission X a od nalezených Person právě
ty, s Permissions X a v mém případě i Person bez Permissions.

Dejme tomu budu chtít všechny uživatele bez oprávnění a zároveň uživatele, 
kteří mají neplatná oprávnění , tj.
chci, aby se mi vrátil např. uživatel A,   který nemá žádné oprávnění a 
uživatel B s nějakými oprávněními, ale neplatnými.

Díky za odpověd.





-- Původní zpráva --
Od: Petr Janata petrjan...@gmail.com
Datum: 29. 4. 2013
Předmět: Re: hibernate-critera s withClause









Zdravím Mirku,


problém je to prastarý (2005) a samotný tvůrce Gavin King se k němu vyjádřil
(https://forums.hibernate.org/viewtopic.php?t=944439). (Doporučuji dočíst 
thread do konce, kde je nádherný flame)


Prakticky chceš asi dosáhnout tohoto:
    Najdi všechny Person, které mají Permission X
    A ZÁROVEŇ
    vrať od nalezených Person všechny Permissions.


To jedním joinem nepůjde, protože Permission musí být X a některé tím pádem 
ve výsledku nebudou, což je v rozporu s druhou polovinou požadavku, že se 
mají vrátit všechny.


Kdyby v třídě JoinWalker nebyla podmínka  ! oj.hasRestriction(), tak by se
kolekce permissions vrátila jen napůl plná. 


Musíš to bohužel napsat explicitně: nejdřív zjistit, které Person entity 
chceš a pak k nim dotáhnout všechny jejich permissions.

Zkusil bych:

   1. 2 query, v první vybrat vhodné Person a pak k nim dotáhnout 
   permissions v druhé query
   2. použít Criteria.ALIAS_TO_ENTITY_MAP
   
(http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associations)
a udělat si mapovací práci ručně v paměti
   3. mohlo by i fungovat FetchMode.SELECT, nebo subquery
   

Petr Janata





2013/4/29 Miroslav Paulfranc paul...@seznam.cz(mailto:paul...@seznam.cz)

Zdravím všechny přítomné.
Narazil jsme v Hibernate (3.6 a 4.0) na problém týkající se Criteria API - 
konkrétně jde o dotahování objektu s kolekcí.

Situace je následující:
Mám dejme tomu třídu Person a ta má kolekci Permissions, která je v hbm 
označena jako lazy loaded (lazy=true).

Pokud chci jedním SQL dotazem načíst osobu s kolekcí oprávnění, použiji:

DetachedCriteria criteria = DetachedCriteria.forClass(Person .class, 
person);
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN);

objekt třídy Person je potom natažen v rámci jednoho SQL dotazu včetně 
Permissions.

Pokud chci do podmínky k části join cokoliv přidat (např. omezit na platné 
perm. kde validDateTo=null),  použiju metodu


DetachedCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html)
 createCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria%28java.lang.String,%20java.lang.String,%20int,%20org.hibernate.criterion.Criterion%29)
(String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 associationPath, String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 alias, int joinType, Criterion
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/Criterion.html)
 withClause)


tj.
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN, nějakáPodmínka);

,pak je generován SQL dotaz přesně tak, jak bych čekal 
(dotaz z konkrétní aplikace: left outer join dbo.zadost_data zadostdata1_ on
this_.zadost_id=zadostdata1_.zadost_id and ( zadostdata1_.vt is not null ))
, ale bohužel se nedotáhne kolekce permissions a pokus o přečtení končí
výjimkou LazyInitializationException..

Zkoušel jsem i nastavovat fetchMode ale bez úspěchu..

Ověřoval jsem na několika aplikacích a všude se stejným výsledkem.

Metoda s parametrem Criterion byla přidána relativně nedávno (v 3.2. 
myslím nebyla).

Připadá mi, že pokud přidám withClause, ignoruje se potom fetch mode.
Tušíte prosím, jestli se dá přidat do join části nějakým jiným způsobem 
další podmínka?

Mimochodem; např. v Hibernate  třídě JoinWalker jsou variace na podmínku


if ( oj.getJoinType()==JoinType.LEFT_OUTER_JOIN   ! oj.hasRestriction() ) 
{
                    //it must be a collection fetch
                    collectionPersisters[j] = collPersister;
                    collectionOwners[j] = oj.getOwner(associations);
                    j++;
                }

kde hasRestriction indikuje použití podmínky withClause, tak nevím, jestli 
to nemůže souviset s tímto problémem..

Předem děkuji za odpověd.
M.P.















Re: hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
S nedotaženými kolekcemi pracuju pořád,  implementuju tak kompletní 
historii, tzn. pokud chci někde historii, mám master tabulku na kterou 
odkazuju z ostatních tabulek a tabulku s daty, kde je platnost valid from a 
valid to a pokud dotahuju takový záznam, vždycky načítám master záznam a 
aktuální datový záznam - tj. kolekci s jedním prvkem (aktuální data).

Pokud bych měl např. třídu Person s historií, tak mám tabulku Person (kde je
jen id,případně create time a autor ) a PersonDatas, kde je datová část s 
historií, takže když chci načíst třídu Person, použiju

criteria=DetachedCriteria.for(Person.class);
criteria.createAlias(personDatas,personData,Criteria.LEFT_JOIN);
criteria.add(Restrictions.isNull(personData.vt));

Pokud použiju takhle postavený dotaz, dostanu všechny osoby s jedním 
aktuálním datovým záznamem v kolekci (používám generování z databáze, navíc 
generuji předky, potomky vytvářím, přidávám metodu vracející onen jediný 
záznam a nepracuji potom s kolekcí, ale s jedním datovým aktuálním záznamem 
).
S ukládáním není problém, protože nepoužívám (záměrně) kaskádní operace - 
většinou pracuji s číselníky a vytvoření záznamu v číselníku při 
ukládání dat by bylo nežádoucí (nechci při uložení Person vytvořit 
Permission, pokud ještě neexistuje, mazání se nepoužívá nikde-taktéž 
nežádoucí). 


Díky za reakci.


-- Původní zpráva --
Od: Petr Janata petrjan...@gmail.com
Datum: 29. 4. 2013
Předmět: Re: hibernate-critera s withClause




Tady myslím se vyjádřil Gavin King přesně:

It cannot be done and it should not be done and you are trying to do a Bad 
Thing.

ORM transparentní není a nebude.


See inline




2013/4/29 Miroslav Paulfranc paul...@seznam.cz(mailto:paul...@seznam.cz)

Ahoj.
 tak by se kolekce permissions vrátila jen napůl plná  - to je to, co 
potřebuju, nechci všechny permissions.


Co by se mělo dít, když na entitě znovu zavoláš EntityManager.merge() nebo 
persist()? Mají se ty nedotažené permissions smazat?
 

SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená.


Jak sám píšeš, kolekce není načtená -  LazyInitializationException



Chci všechny Person, které mají Permission X a od nalezených Person právě
ty, s Permissions X a v mém případě i Person bez Permissions.

Dejme tomu budu chtít všechny uživatele bez oprávnění a zároveň uživatele, 
kteří mají neplatná oprávnění , tj.
chci, aby se mi vrátil např. uživatel A,   který nemá žádné oprávnění a 
uživatel B s nějakými oprávněními, ale neplatnými.

Díky za odpověd.





-- Původní zpráva --
Od: Petr Janata petrjan...@gmail.com(mailto:petrjan...@gmail.com)
Datum: 29. 4. 2013
Předmět: Re: hibernate-critera s withClause











Zdravím Mirku,


problém je to prastarý (2005) a samotný tvůrce Gavin King se k němu vyjádřil
(https://forums.hibernate.org/viewtopic.php?t=944439). (Doporučuji dočíst 
thread do konce, kde je nádherný flame)


Prakticky chceš asi dosáhnout tohoto:
    Najdi všechny Person, které mají Permission X
    A ZÁROVEŇ
    vrať od nalezených Person všechny Permissions.


To jedním joinem nepůjde, protože Permission musí být X a některé tím pádem 
ve výsledku nebudou, což je v rozporu s druhou polovinou požadavku, že se 
mají vrátit všechny.


Kdyby v třídě JoinWalker nebyla podmínka  ! oj.hasRestriction(), tak by se
kolekce permissions vrátila jen napůl plná. 


Musíš to bohužel napsat explicitně: nejdřív zjistit, které Person entity 
chceš a pak k nim dotáhnout všechny jejich permissions.

Zkusil bych:

   1. 2 query, v první vybrat vhodné Person a pak k nim dotáhnout 
   permissions v druhé query
   2. použít Criteria.ALIAS_TO_ENTITY_MAP
   
(http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associations)
a udělat si mapovací práci ručně v paměti
   3. mohlo by i fungovat FetchMode.SELECT, nebo subquery
   

Petr Janata





2013/4/29 Miroslav Paulfranc paul...@seznam.cz(mailto:paul...@seznam.cz)

Zdravím všechny přítomné.
Narazil jsme v Hibernate (3.6 a 4.0) na problém týkající se Criteria API - 
konkrétně jde o dotahování objektu s kolekcí.

Situace je následující:
Mám dejme tomu třídu Person a ta má kolekci Permissions, která je v hbm 
označena jako lazy loaded (lazy=true).

Pokud chci jedním SQL dotazem načíst osobu s kolekcí oprávnění, použiji:

DetachedCriteria criteria = DetachedCriteria.forClass(Person .class, 
person);
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN);

objekt třídy Person je potom natažen v rámci jednoho SQL dotazu včetně 
Permissions.

Pokud chci do podmínky k části join cokoliv přidat (např. omezit na platné 
perm. kde validDateTo=null),  použiju metodu


DetachedCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html)
 createCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria

Re: hibernate-critera s withClause

2013-04-29 Tema obsahu Miroslav Paulfranc
Díky za tip.
Tenhle způsob používám zřídka spíš pro speciální věci, ale zkusím to.


-- Původní zpráva --
Od: Ondra Medek xmed...@gmail.com
Datum: 29. 4. 2013
Předmět: Re: hibernate-critera s withClause



Ahoj, zkus SqlQuery.




2013/4/29 Miroslav Paulfranc paul...@seznam.cz(mailto:paul...@seznam.cz)

Ahoj.
 tak by se kolekce permissions vrátila jen napůl plná  - to je to, co 
potřebuju, nechci všechny permissions.

SQL dotaz vrací přesně to, co potřebuju, jen není kolekce načtená.

Chci všechny Person, které mají Permission X a od nalezených Person právě
ty, s Permissions X a v mém případě i Person bez Permissions.

Dejme tomu budu chtít všechny uživatele bez oprávnění a zároveň uživatele, 
kteří mají neplatná oprávnění , tj.
chci, aby se mi vrátil např. uživatel A,   který nemá žádné oprávnění a 
uživatel B s nějakými oprávněními, ale neplatnými.

Díky za odpověd.





-- Původní zpráva --
Od: Petr Janata petrjan...@gmail.com(mailto:petrjan...@gmail.com)
Datum: 29. 4. 2013
Předmět: Re: hibernate-critera s withClause











Zdravím Mirku,


problém je to prastarý (2005) a samotný tvůrce Gavin King se k němu vyjádřil
(https://forums.hibernate.org/viewtopic.php?t=944439). (Doporučuji dočíst 
thread do konce, kde je nádherný flame)


Prakticky chceš asi dosáhnout tohoto:
    Najdi všechny Person, které mají Permission X
    A ZÁROVEŇ
    vrať od nalezených Person všechny Permissions.


To jedním joinem nepůjde, protože Permission musí být X a některé tím pádem 
ve výsledku nebudou, což je v rozporu s druhou polovinou požadavku, že se 
mají vrátit všechny.


Kdyby v třídě JoinWalker nebyla podmínka  ! oj.hasRestriction(), tak by se
kolekce permissions vrátila jen napůl plná. 


Musíš to bohužel napsat explicitně: nejdřív zjistit, které Person entity 
chceš a pak k nim dotáhnout všechny jejich permissions.

Zkusil bych:

   1. 2 query, v první vybrat vhodné Person a pak k nim dotáhnout 
   permissions v druhé query
   2. použít Criteria.ALIAS_TO_ENTITY_MAP
   
(http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#querycriteria-associations)
a udělat si mapovací práci ručně v paměti
   3. mohlo by i fungovat FetchMode.SELECT, nebo subquery
   

Petr Janata





2013/4/29 Miroslav Paulfranc paul...@seznam.cz(mailto:paul...@seznam.cz)

Zdravím všechny přítomné.
Narazil jsme v Hibernate (3.6 a 4.0) na problém týkající se Criteria API - 
konkrétně jde o dotahování objektu s kolekcí.

Situace je následující:
Mám dejme tomu třídu Person a ta má kolekci Permissions, která je v hbm 
označena jako lazy loaded (lazy=true).

Pokud chci jedním SQL dotazem načíst osobu s kolekcí oprávnění, použiji:

DetachedCriteria criteria = DetachedCriteria.forClass(Person .class, 
person);
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN);

objekt třídy Person je potom natažen v rámci jednoho SQL dotazu včetně 
Permissions.

Pokud chci do podmínky k části join cokoliv přidat (např. omezit na platné 
perm. kde validDateTo=null),  použiju metodu


DetachedCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html)
 createCriteria
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/DetachedCriteria.html#createCriteria%28java.lang.String,%20java.lang.String,%20int,%20org.hibernate.criterion.Criterion%29)
(String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 associationPath, String
(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html?is-external=true)
 alias, int joinType, Criterion
(http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/criterion/Criterion.html)
 withClause)


tj.
criteria.createCriteria(permissions, permission, DetachedCriteria.LEFT_
JOIN, nějakáPodmínka);

,pak je generován SQL dotaz přesně tak, jak bych čekal 
(dotaz z konkrétní aplikace: left outer join dbo.zadost_data zadostdata1_ on
this_.zadost_id=zadostdata1_.zadost_id and ( zadostdata1_.vt is not null ))
, ale bohužel se nedotáhne kolekce permissions a pokus o přečtení končí
výjimkou LazyInitializationException..

Zkoušel jsem i nastavovat fetchMode ale bez úspěchu..

Ověřoval jsem na několika aplikacích a všude se stejným výsledkem.

Metoda s parametrem Criterion byla přidána relativně nedávno (v 3.2. 
myslím nebyla).

Připadá mi, že pokud přidám withClause, ignoruje se potom fetch mode.
Tušíte prosím, jestli se dá přidat do join části nějakým jiným způsobem 
další podmínka?

Mimochodem; např. v Hibernate  třídě JoinWalker jsou variace na podmínku


if ( oj.getJoinType()==JoinType.LEFT_OUTER_JOIN   ! oj.hasRestriction() ) 
{
                    //it must be a collection fetch
                    collectionPersisters[j] = collPersister;
                    collectionOwners[j] = oj.getOwner(associations);
                    j++;
                }

kde hasRestriction indikuje použití

Re: Jak co nejlépe zareagovat na znullování objektu?

2011-06-09 Tema obsahu Miroslav Paulfranc
Není pak lepší místo nastavení na null (item = null;) použít např. nějaký null 
object (item=NullItem)?
(např. http://sourcemaking.com/design_patterns/null_object/java-0)

  Původní zpráva 
 Od: Libor Jelinek ljeli...@virtage.com
 Předmět: Jak co nejlépe zareagovat na znullování objektu?
 Datum: 09.6.2011 09:15:56
 
 Dobrý den!
 Chtěl bych probrat, jak by kdo řešil následující problém ochrany proti
 NullPointerException pokud s jednou referenční proměnnou pracuje současně
 více částí aplikace (více Swing formulářů nebo JPA perzisence a JavaServer
 Faces web GUI současně apod.).

 OrderItem item = new OrderItem();

 *// V nějaké vrstvě se při vytváření položky nastaví nějaké hodnoty*
 item.setPN(123);
 item.setQty(2);

 *// V jiné vrstvě uživatel smaže položku. Reference je na null.*
 item = null;

 *// Další vrstva to neví a zavolá, což **skončí chybou NullPointerException*
 item.getPN();**

 Jak k tomu co nejlépe přistoupit? Mě napadají tak dvě možnosti:
 1. Do do getter metod přidat kontrolu na na null a v tom případě vrátit např
 -1.
 2. Oznamovat si změny např. beanovským PropertyChangeListener, což by ale
 hodně zkomplikovalo kód.

 Budu rád za Vaše názory.
 Libor





Re: Proč není genericita v metodách Map jako get(), remove()?

2011-04-14 Tema obsahu Miroslav Paulfranc
michal,ježek,1987-03-09 nebo případně jinou příslušnou formu by mohla vracet 
např. metoda toString;
pak už by bylo ale asi lepší vytvořit klíč jako samostatnou třídu; faktem ale 
asi je, že většinou je klíčem String nebo nějaký numerický typ


  Původní zpráva 
 Od: Oto Buchta ta...@buchtovi.cz
 Předmět: Re: Proč není genericita v metodách Map jako get(), remove()?
 Datum: 14.4.2011 00:45:00
 
 2011/4/13 Miroslav Paulfranc paul...@seznam.cz

  Dobrý den.
  Myslím si, že
 
  datumyNarozeni.get(p.getLogin());
 
  by nešlo použít, pokud by byl klíč složený z více položek.
  Pokud by objekt Person měl např. string name a string surname, nebo by
  došlo následně k dalšímu rozšíření - např. o rok narození, stačilo by myslím
  pouze náležitě změnit hash a equals a vše by pořád fungovalo.
 
 
 Pak ale nemohu přes michal vkládat do mapy. To bych musel použít třeba
 michal,ježek,1987-03-09
 a odpovídajícím způsobem naimplementovat ten equals() a hashCode(). Ale co
 když někdo zapomene,
 že se teď už musí používat datum narození a zadá jenom michal,ježek?


    Původní zpráva 
   Od: Ondřej Fafejta fafejta.ond...@gmail.com
   Předmět: Re: Proč není genericita v metodách Map jako get(), remove()?
   Datum: 13.4.2011 08:38:05
   
   2011/4/13 Martin Beránek martin.bera...@i.cz:
Zdravím,
   
našel jsem celkem rozumné vysvětlení:
   
Restrikce se zavádějí proto, aby se něco nepokazilo.
   
Zavoláním get s jiným typem se nic nepokazí. Ještě trošku umělý
  příklad:
   
MapString,Date datumyNarozeni = ...
class Person {
   String fullName
   String login
   
   hashCode {
   return login.hashCode();
   }
   
   equals(Object o) {
   return login.equals(o);
   }
}
   
datumyNarozeni.put(michal,new Date());
   
odnekud mi prijde objekt Person p kde je login michal, pak muzu udelat:
   
datumyNarozeni.get(p) a dostanu to spravne datum
   
Martin
   
  
   tak tento příklad se mi hodně nelíbí. Takového programátora zatahat za
  uši ;-)
   Nebudu koukat do implementace Person, jak je napsaný hashCode a equals
  ...
   Určitě by každý normální programátor napsal toto:
  
   datumyNarozeni.get(p.getLogin());
  
   V každém případě - původní dotaz je docela namístě.
   Úryvek ze stackoverflow mě úplně nepřesvědčil ...
   Kdyby člověk použil
   MapList, Something místo MapArrayList, Something, tak by to
   fungovalo i s ArrayList i s LinkedList.
  
   Fafi
  
  
  
 



 --
 Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com





Re: Proč není genericita v metodách Map jako get(), remove()?

2011-04-13 Tema obsahu Miroslav Paulfranc
Dobrý den.
Myslím si, že

datumyNarozeni.get(p.getLogin());

by nešlo použít, pokud by byl klíč složený z více položek.
Pokud by objekt Person měl např. string name a string surname, nebo by došlo 
následně k dalšímu rozšíření - např. o rok narození, stačilo by myslím pouze 
náležitě změnit hash a equals a vše by pořád fungovalo.



  Původní zpráva 
 Od: Ondřej Fafejta fafejta.ond...@gmail.com
 Předmět: Re: Proč není genericita v metodách Map jako get(), remove()?
 Datum: 13.4.2011 08:38:05
 
 2011/4/13 Martin Beránek martin.bera...@i.cz:
  Zdravím,
 
  našel jsem celkem rozumné vysvětlení:
 
  Restrikce se zavádějí proto, aby se něco nepokazilo.
 
  Zavoláním get s jiným typem se nic nepokazí. Ještě trošku umělý příklad:
 
  MapString,Date datumyNarozeni = ...
  class Person {
         String fullName
         String login
 
         hashCode {
                 return login.hashCode();
         }
 
         equals(Object o) {
                 return login.equals(o);
         }
  }
 
  datumyNarozeni.put(michal,new Date());
 
  odnekud mi prijde objekt Person p kde je login michal, pak muzu udelat:
 
  datumyNarozeni.get(p) a dostanu to spravne datum
 
  Martin
 

 tak tento příklad se mi hodně nelíbí. Takového programátora zatahat za uši ;-)
 Nebudu koukat do implementace Person, jak je napsaný hashCode a equals ...
 Určitě by každý normální programátor napsal toto:

 datumyNarozeni.get(p.getLogin());

 V každém případě - původní dotaz je docela namístě.
 Úryvek ze stackoverflow mě úplně nepřesvědčil ...
 Kdyby člověk použil
 MapList, Something místo MapArrayList, Something, tak by to
 fungovalo i s ArrayList i s LinkedList.

 Fafi