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

Odpovedet emailem