Zdravím Tak chyba je opět mezi židlí a klávesnicí. @Fetch(JOIN) nefunguje pro tento typ anotace @OneToMany. Přehlédl jsem to v dokumentaci viz. http://www.hibernate.org/hib_docs/annotations/reference/en/html/entity.html#entity-hibspec-singleassoc-fetching
Děkuji za rady. Martin -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Jiri Mares Sent: Thursday, June 07, 2007 2:34 PM To: Java Subject: Re: Hibernate @Fetch(JOIN) Ahoj, pozor, i kdyby pouzil tak pouzije outer join a ne inner join. A to muze byt dost znatelny vykonostni pad ... proto doporucuji prespat HQL dotazy pomoci "inner join fetch", kde se skutecne pouzije inner join ... Jirka Martin Chalupa napsal(a): > Zdravím, > > > > Batch loading jsem zkoušel, ale získal jsem mnohem horší výsledky než u > obyčejného lazy. Testoval jsem na databázi derby. > > Volal jsem Invoice.all dotaz, v db jsem měl 10000 záznamů Invoice, každý > se 4mi InvoiceEntry. S @Fetch(SELECT) a @Fetch(JOIN) trval 30s. > > S @BatchSize(size = 3) to trvalo 330s > > > > for(Invoice i: invoiceDao.getAll()){ > > for (InvoiceEntry e: i.getInvoiceEntries()){ > > System.out.println(e.getName()+ " " + count); > > } > > count++; > > } > > > > Jen mě překvapilo, že se neupoužívá ten join v sql při @Fetch(JOIN). > Zkusím ještě tu jinou verzi hibernate, používám 3.2.4.sp1. > > > > Martin > > > > *From:* [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > *On Behalf Of *Petr Ferschmann > *Sent:* Thursday, June 07, 2007 11:10 AM > *To:* Java > *Subject:* Re: Hibernate @Fetch(JOIN) > > > > Zdravím, > > nebo využít vlastnost zvanou Batch Loading. Dotazy pak vypadají takto: > > Hibernate: select invoice0_.id as id0_, invoice0_.created as created0_ > from Invoice invoice0_ > > > > Hibernate: select invoiceent0_.INVOICE_FK as INVOICE3_1_, invoiceent0_.id as > id1_, > > invoiceent0_.id as id1_0_, invoiceent0_.INVOICE_FK as INVOICE3_1_0_, > invoiceent0_.name as name1_0_ > > from InvoiceEntry invoiceent0_ where invoiceent0_.INVOICE_FK in (?, ?, ?) > > > Je to výborný kompromis mezi lazy a eager loadingem se zachováním výkonu > - nemusím mít pak dotazy typu "vrať mi zakázky a k nim jejich položky" a > "vrať mi zakázky" > přičemž obě vrací "jen" kolekci zakázek. > > > Jiri Mares píše v Čt 07. 06. 2007 v 09:39 +0200: > > > > Ahoj, asi by nebylo nezajimave zminit verzi Hibernate ... > > > > Pokud pouzivate dotaz, pak jste schopen zapisem inner join fetch nebo outer > join fetch donutit hibernate aby to dotahla > > rovnou. Chovani Hibernate je spis to nedelat a zavisle entity tahat > separatnimi dotazy, aby se dalo vyuzivat cachovani. > > > > Takze pro vas pripad asi neco: > > > > from Invoice as i inner join fetch i.invoiceEntries > > > > Jirka > > > > Martin Chalupa napsal(a): > >> Dobrý den, ladím rychlost hibernatu při načítání provázaných entit a > >> narazil jsem na následující věc. Mám tyto entity. > >> > >> > >> > >> @Entity > >> > >> @NamedQueries({ > >> > >> @NamedQuery(name = "Invoice.all", query = "from Invoice"), > >> > >> @NamedQuery(name = "Invoice.allFetch", query = "select distinct i > >> from Invoice as i left join fetch i.invoiceEntries") > >> > >> }) > >> > >> public class Invoice { > >> > >> @Id > >> > >> @GeneratedValue(strategy = GenerationType.AUTO) > >> > >> private Long id; > >> > >> @Basic > >> > >> private Date created; > >> > >> @OneToMany(cascade = CascadeType.ALL, mappedBy = "invoice) > >> > >> @Fetch(FetchMode.JOIN) > >> > >> private Set<InvoiceEntry> invoiceEntries; > >> > >> } > >> > >> > >> > >> @Entity > >> > >> public class InvoiceEntry { > >> > >> @Id > >> > >> @GeneratedValue(strategy = GenerationType.AUTO) > >> > >> private Long id; > >> > >> @Basic > >> > >> private String name; > >> > >> @ManyToOne > >> > >> @JoinColumn(name="INVOICE_FK") > >> > >> private Invoice invoice; > >> > >> } > >> > >> > >> > >> Volám tento dotaz: > >> sessionFactory.getCurrentSession().getNamedQuery("Invoice.all").list(); > >> > >> > >> > >> V této konfiguraci bych očekával v logu jeden provedený dotaz který bude > >> obsahovat join, ale je tam toto: > >> > >> > >> > >> Hibernate: select invoice0_.id as id0_, invoice0_.created as created0_ > >> from Invoice invoice0_ > >> > >> Hibernate: select invoiceent0_.INVOICE_FK as INVOICE3_1_, > >> invoiceent0_.id as id1_, invoiceent0_.id as id1_0_, > >> invoiceent0_.INVOICE_FK as INVOICE3_1_0_, invoiceent0_.name as name1_0_ > >> from InvoiceEntry invoiceent0_ where invoiceent0_.INVOICE_FK=? > >> > >> Hibernate: select invoiceent0_.INVOICE_FK as INVOICE3_1_, > >> invoiceent0_.id as id1_, invoiceent0_.id as id1_0_, > >> invoiceent0_.INVOICE_FK as INVOICE3_1_0_, invoiceent0_.name as name1_0_ > >> from InvoiceEntry invoiceent0_ where invoiceent0_.INVOICE_FK=? > >> > >> Hibernate: select invoiceent0_.INVOICE_FK as INVOICE3_1_, > >> invoiceent0_.id as id1_, invoiceent0_.id as id1_0_, > >> invoiceent0_.INVOICE_FK as INVOICE3_1_0_, invoiceent0_.name as name1_0_ > >> from InvoiceEntry invoiceent0_ where invoiceent0_.INVOICE_FK=? > >> > >> > >> > >> Tušíte někdo kde by mohl být problém? Nebo je toto chování normální? > >> > >> Předem děkuji za odpověď. > >> > >> Martin Chalupa > >> > > > > Petr Ferschmann > > > > > > SoftEU s.r.o. > > ----------------------------------- > > Bolevecká 6 > > 301 00 Plzen > > Czech Republic > > ----------------------------------- > > Phone: +420 373 731 284 > > +420 373 729 300 > > Fax: +420 373 729 301 > > Cell: +420 775 638 008 > > E-mail: [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > > > -- Jiří Mareš (mailto:[EMAIL PROTECTED]) ČSAD SVT Praha, s.r.o. (http://www.svt.cz) Czech Republic
