[Hibernate] lazy loading

Pagina: 1
Acties:

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
Ik heb volgende constructie:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<class name="be.test.vo.Points" table="pcacpoints" lazy="true">
        <id name="rewardId" type="long" unsaved-value="null">
            <generator class="identity"/>
        </id>
        <many-to-one name="product" class="be.test.vo.Product" column="productId" lazy="true" cascade="none"/>
        <property name="startDate"/>
        <property name="realisationAmount0"/> 
</class>


    <class name="be.test.vo.Product" table="pcacproduc" lazy="false">
        <id name="productId" type="long" unsaved-value="null">
            <generator class="identity"/>
        </id>

        <property name="inactiveDate"/>
    
        <bag name="points" cascade="all-delete-orphan" inverse="true"  lazy="false" batch-size="1" outer-join="auto"
            <key column="productId" not-null="true"/> 
            <one-to-many class="be.test.vo.Points"/> 
        </bag>


Er is dus een Product waar ik een lijst van Points heb een Bag, er ligt een dubbele associatie. Maw ik heb in Points ook een many-to-one naar een Product. Met inverse="true" heb ik aangeven dat points de associatie beheert.

Ik wil nu als ik een Points object ophaal dat hij niet naar de databank gaat om al de gegevens van een Product op te halen, daarom dacht ik lazy="true" in de many-to-one associatie van product te plaatsten, maar dit geeft blijkbaar geen nut?

Is dit doordat de hiberate sessie reeds afgesloten is waardoor dat alles opgehaald wordt? En is er een manier om te forceren dat hij niet het volledig product ophaalt (want daar zit nog een heel stuk meer in Product en zorgt voor veel databank verkeer)

[ Voor 37% gewijzigd door Cuball op 30-11-2005 13:37 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 21:53

bloody

0.000 KB!!

Gebruik je hibernate 3.x? Dan is lazy standaard true, en hoef je dit niet expliciet aan te geven.

Om te voorkomen dat hibernate naar je db gaat om zaken op te halen moet je er ook op letten dat je geen zaken in je setters doet die daarvoor kunnen zorgen. (bijvoorbeeld het itereren over een binnenkomende collectie).

Waarom staat er een lazy="false" in je products bag?

nope


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
bloody schreef op woensdag 30 november 2005 @ 12:48:
Gebruik je hibernate 3.x? Dan is lazy standaard true, en hoef je dit niet expliciet aan te geven.

Om te voorkomen dat hibernate naar je db gaat om zaken op te halen moet je er ook op letten dat je geen zaken in je setters doet die daarvoor kunnen zorgen. (bijvoorbeeld het itereren over een binnenkomende collectie).
ja ik gebruik hibernate3, maar heb ik de hibernate logs bekeken en hij voert effectief al query's uit voor een Product op te halen bij het laden van een Points object
Waarom staat er een lazy="false" in je products bag?
oeps had ik eventjes gewijzigd om te testen, ik heb het ondertussen aangepast in de TS

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:48

momania

iPhone 30! Bam!

Haal overal lazy="xxx" eens weg. Zoals gezegd is lazy standaard in Hibernate 3.

Neem je whisky mee, is het te weinig... *zucht*


  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
dat heb ik al gedaan, hij blijft altijd alles laden

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:48

momania

iPhone 30! Bam!

Cuball schreef op donderdag 01 december 2005 @ 08:33:
dat heb ik al gedaan, hij blijft altijd alles laden
dat is vreemd.

Je hebt verder geen rare instellingen gezet in je hibernate config ?

Laat anders even wat voorbeeld code zien van het ophalen van een Point, misschien doe je daar wel wat verkeerd. :)

Neem je whisky mee, is het te weinig... *zucht*


  • Stephan Oudmaijer
  • Registratie: Oktober 2000
  • Laatst online: 16-08-2023
Cuball schreef op donderdag 01 december 2005 @ 08:33:
dat heb ik al gedaan, hij blijft altijd alles laden
Niet stiekem de max fetch depth in je hibernate config ingesteld?

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
lazy loading werkt wel op die bag collection van Points, als ik daar lazy="true" plaatst dan wordt de collectie inderdaad niet ingeladen bij het ophalen van een Product, maar dit is niet gewenst, ik wil als ik een product ophaal wel alles van Product ophalen, maar als ik een Points (item van de lijst van points in een Product) ophaal wil ik niet dat het volledig Product waar het inzit ook opgehaald wordt.

Misschien is dit wel niet mogelijk doordat er een associatie ligt in Points naar product (many-to-one) en omdat Product een lijst bevat waarin het Points object dat ik wil ophalen al effectief zit?

[ Voor 4% gewijzigd door Cuball op 01-12-2005 11:05 ]

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • -FoX-
  • Registratie: Januari 2002
  • Niet online

-FoX-

Carpe Diem!

Als je lazy="true" specifieert in je many-to-one, dan zal het product toch gefetcht worden aangezien de default in Hibernate3 lazy="proxy" is. Dus je kan deze best veranderen naar lazy="proxy", ofwel gewoon niet specifieren.

Maar daar ligt het probleem niet. Je zal je ervoor moeten zorgen dat je Product class 'lazy' is zodat er een proxy van gemaakt kan worden. Want indien er geen proxy beschikbaar is, zal deze class altijd meteen gefetcht worden.

  • Cuball
  • Registratie: Mei 2002
  • Laatst online: 21-04 16:24
ahja lijkt inderdaad wel logisch, maar voorlopig werken wij met geen lazy loading, het geeft in onze gevallen toch teveel problemen. Het zijn voornamelijk webapplicaties en sessie worden dus niet open gehouden... de sessie bijhouden in de threadlocal is een optie maar het blijft moeilijk om de grens te trekken waar je nu iest volledig inlaad of niet

"Live as if you were to die tomorrow. Learn as if you were to live forever"


  • sparidem
  • Registratie: Januari 2004
  • Laatst online: 10-08-2025
Hiervoor kan je het best de sessie door een servletfilter af laten sluiten (Open Session in View pattern). Kijk voor documentatie op http://www.hibernate.org/43.html

Als de presentatielaag bij lazy geladen objecten moet kunnen komen buiten de sessie kan je ook overwegen om deze objecten vooraf te laten initialiseren met session.initialize( object ) oid.

[ Voor 37% gewijzigd door sparidem op 05-12-2005 12:49 ]

Pagina: 1