-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 
Author Message
 Post subject: Lazy loading bei ACCESSTYPE="field" vs. "prop
PostPosted: Sun Feb 22, 2009 7:46 am 
Newbie

Joined: Sun Feb 22, 2009 7:33 am
Posts: 3
Hallo,

gibt es eine Doku, die das Verhalten von Hibernate beim Lazy-Loading von unterschiedlichen Accesstypes beschreibt?

Im Augenblick benutzen wir Property-Access und sind damit prompt in das Problem mit den nicht initialisierten Objektfeldern gelaufen.
Siehe: http://blog.xebia.com/2008/03/08/advanc ... -pitfalls/

Die Frage ist, ob ein Wechsel auf den Accesstype "Field" das Problem lösen würde (also die Felder setzt) und welche Einschränkungen sich dadurch ergeben würden. Wie realisiert Hibernate diesen Zugriff? Ändert sich am Verhalten / der Performance des lazy-loadings etwas?

Wäre für alle Hinweise und Erfahrungen dankbar. Das Thema scheint im Hinblick auf lazy loading kaum diskutiert zu werden.

Danke,
Peter


Top
 Profile  
 
 Post subject:
PostPosted: Mon Feb 23, 2009 5:00 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
Hi,
also eine gute Doku zu dem Thema kenn ich leider auch nicht. Das liegt aber vielleicht auch daran, dass sich das Verhalten eigentlich nicht ändert. Das Problem, dass dein Proxy nicht initialisiert wird, wirst du wohl auch bei Field-access haben, da es eher in der Natur von Java liegt. Denn Proxies werden durch subklassen realisiert, in denen man die get-methoden überschreiben kann, sodass diese ggf. den Proxy initialisieren. Felder kann man nicht überladen, nur "verstecken". Du solltest also bei Property-access bleiben und immer getter verwenden, anstatt direkten Zugriff.

Dies hat einen vorteil der leider auch nie klar beschrieben ist: Nur dann wird der Proxy nicht initialisiert, wenn du den Id-Getter aufrufst. Nutzt du Field-access wird er immer initialisiert.

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject: Tja...
PostPosted: Tue Feb 24, 2009 5:04 am 
Newbie

Joined: Sun Feb 22, 2009 7:33 am
Posts: 3
Danke,

das hatte ich befürchtet. Obwohl ich das Verhalten für nicht so sinnvoll halte: Selbst wenn der Proxy initialisiert ist, setzt er nicht die (geerbten) Felder, so dass unnötigerweise(?) eine NullPointerEx auftritt.

Ausserdem hatte ich gehofft, dass der Proxy sich im Falle einer Field-Access-Konfiguration über Reflexion und ByteCode Instrumentation in das Objekt einklinkt. Schliesslich wäre es wohl nur so möglich, auf getter/setter zu verzichten. Und dafür ist Field-Access doch letztlich gedacht, oder?

Ich werd bei Gelegenheit mal einen Test schreiben.

Gruß,
Peter


Top
 Profile  
 
 Post subject: Re: Tja...
PostPosted: Tue Feb 24, 2009 6:16 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
peterhen wrote:
Ausserdem hatte ich gehofft, dass der Proxy sich im Falle einer Field-Access-Konfiguration über Reflexion und ByteCode Instrumentation in das Objekt einklinkt. Schliesslich wäre es wohl nur so möglich, auf getter/setter zu verzichten. Und dafür ist Field-Access doch letztlich gedacht, oder?

Ich denke momentan ist Field-access lediglich dann sinnvoll, wenn man nicht für alle properties getter und setter anbieten will. Außerdem ist es dann sinnvoll, wenn man z.B. im Setter zusätzlichen Code, wie eine Berechnung ausführen will, um vielleicht ein Transient-Attribute zu setzen. Was meinst du?

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject: Re: Tja...
PostPosted: Tue Feb 24, 2009 6:18 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
double post

_________________
-----------------
Need advanced help? http://www.viada.eu


Last edited by mmerder on Tue Feb 24, 2009 7:41 am, edited 1 time in total.

Top
 Profile  
 
 Post subject: Re: Tja...
PostPosted: Tue Feb 24, 2009 6:20 am 
Expert
Expert

Joined: Thu Jan 08, 2009 6:16 am
Posts: 661
Location: Germany
double post

_________________
-----------------
Need advanced help? http://www.viada.eu


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 25, 2009 5:23 am 
Newbie

Joined: Sun Feb 22, 2009 7:33 am
Posts: 3
Hallo,

um das Thema abzuschliessen: Ein Test mit Annotations / Field Access an einem Objektbaum Parent -> 1-M Childs -> 1-1 ChildAddress hat gezeigt, dass sich die Hibernate-Proxies genau wie beim Property-Access verhalten. Die Felder werden auch nicht initialisert. Der Proxy wird erst beim Aufruf einer Objekt-Methode geladen, nicht jedoch beim Zugriff auf ein public field.
Schade...

Gruß,
Peter


Code:
@Entity
@Table(name = "TBL_PARENT_TEST")
public class ParentTest {

   @Id
   public Long id;

   @OneToMany(targetEntity = ChildTest.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   @JoinColumn(name = "P_ID")
   public List<ChildTest> childList;

}


@Entity
@Table(name = "TBL_CHILD_TEST")
public class ChildTest {

   @Id
   public Long id;

   @OneToOne(targetEntity = ChildName.class, cascade = CascadeType.ALL, fetch = FetchType.LAZY)
   public ChildName childName;

   @Override
   public boolean equals(Object obj) {

      if (obj == null)
         return false;

      if (!(obj instanceof ChildTest))
         return false;
      else {
         ChildTest other = (ChildTest) obj;
         // if (this.childName.name.equals(other.childName.name)) funktioniert nicht
         if (this.childName.name.equals(other.childName.getName()))
            return true;
         else
            return false;
      }
   }

   @Override
   public int hashCode() {
      return childName.hashCode();
   }


@Entity
@Table(name = "TBL_CHILD_TEST")
public class ChildName {

   @Id
   Long id;

   String name;

   /**
    * @return the name
    */
   public String getName() {
      return name;
   }

   /**
    * @param name
    *            the name to set
    */
   public void setName(String name) {
      this.name = name;
   }



Top
 Profile  
 
 Post subject:
PostPosted: Sat Feb 28, 2009 6:41 pm 
Newbie

Joined: Mon Jul 21, 2008 5:52 am
Posts: 13
Hy Peter,

peterhen wrote:
Hallo,

um das Thema abzuschliessen: Ein Test mit Annotations / Field Access an einem Objektbaum Parent -> 1-M Childs -> 1-1 ChildAddress hat gezeigt, dass sich die Hibernate-Proxies genau wie beim Property-Access verhalten. Die Felder werden auch nicht initialisert. Der Proxy wird erst beim Aufruf einer Objekt-Methode geladen, nicht jedoch beim Zugriff auf ein public field.
Schade...

Gruß,
Peter



Sorry, aber ich habs ned Kapiert, was du uns da sagen möchtest. Sorry.

robert


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 8 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.