-->
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.  [ 2 posts ] 
Author Message
 Post subject: Lazy-loading eines Lobs
PostPosted: Wed Nov 10, 2010 2:44 pm 
Newbie

Joined: Wed Nov 10, 2010 2:28 pm
Posts: 2
Hallo zusammen,

ich habe mich jetzt schon Stunden verzweifelt durchs Netz gesucht, letztendlich stelle ich euch hier meine Frage:

Ich habe eine Klasse file, die ein Clob beinhaltet. Da es ein Clob ist und Clobs für große Daten gedacht sind, möchte ich es natürlich nicht mitladen, wenn ich eine Übersicht von files sehen will.

Code:
@Entity
@Table(name = "FILES")
public class File implements Serializable {

   @Id
   @Column(name = "ID")
   private int id;

   @Lob
   @Column(name = "DATA")
   @Basic(fetch = FetchType.LAZY)
   private char[] data;

   // ...
   // getter and setter
   // ...

}


Normalerweise würde ich von Hibernate jetzt erwarten, dass es das Lob dann nachläd, wenn ich darauf zugreife.
Greift man mit JDBC zu, bekommt man ja schließlich auch nur eine Referenz, die man sich dann per Stream laden kann.

Doch aus irgendwelchen Gründen funktioniert das bei Hibernate nicht direkt, wie ich lesen musste.
Es steht in der Dokumentation etwas von einer "Bytecode Instrumentation".
Ich kann nicht viel damit anfangen und habe wirklich nichts brauchbares gefunden, wie man eine solche für dieses Hibernate-Problem anlegt (also weder was das ist, wie das genau funktioniert, noch eine Anleitung, wie man es einfügt).

Ich muss noch dazusagen, ich arbeite mit Eclipse.

Folglich wäre ich glücklich, wenn mir jemand sagen könnte, wie das ganze denn funktioniert :).
Ich finde da echt keinen Einstieg..

Schon einmal vielen Dank im Voraus!


Top
 Profile  
 
 Post subject: Re: Lazy-loading eines Lobs
PostPosted: Mon Dec 06, 2010 4:38 pm 
Newbie

Joined: Mon May 21, 2007 3:36 am
Posts: 16
Normalerweise sieht der "getter" des bean properties "data" so aus:
Code:
public char[] getData() {
    return data;
}

Soll das bean property data "lazy", d.h. "on demand" nachgeladen werden, so muss hibernate eine "chance" bekommen, beim Aufruf der getData-Methode eingreifen zu können, um die Daten aus der Datenbank nachladen zu können, bevor der getter retourniert. D.h. der Code müsste in etwa so aussehen:
Code:
public char[] getData() {
    loadDataIfNotLoadedYet(); // PSEUDO-CODE - METHODE EXISTIERT NICHT WIRKLICH!
    return data;
}

Damit der Entwickler dies nicht selbst "händisch" implementieren muss, wird der Bytecode der beans nachträglich um diesen "nachlade-code" erweitert, d.h. in den .class-Dateien wird nachträglich zusätzlicher Code "eingebaut". Dies wird "bytecode instrumentation" genannt und muss manuell - z.b. via ant - durchgeführt werden.

Siehe auch: http://docs.jboss.org/hibernate/core/3. ... properties

Eine andere, einfachere Möglichkeit, wäre, für das property data statt char[] direkt den Datentyp Clob zu verwenden. Da ein Clob nur der Locator für die tatsächlichen Character-Daten ist, werden letztere nicht sofort geladen sondern können via
Code:
file.getData().getReader()

als Stream angefordert werden.
Ob tatsächlich ein Stream geöffnet wird, oder doch der gesamte Text aus der Datenbank in einem Satz geladen wird, hängt jedoch auch hier letztlich von der Datenbank und dem verwendeten JDBC-Treiber ab.

_________________
Mario.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 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.