dotaz k SOAPHandler - xmlns=""
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
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
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
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
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
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
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
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
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
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
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?
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()?
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()?
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