JPA lazy einfache byte[] Feld-Ebene
Leider ist der code unten funktioniert nicht. Bild ist immer abgerufen!
@Entity
public Car implements Serializable {
...
@Basic(fetch = FetchType.LAZY) //Neither with @Lob
private byte[] image;
...
}
SETUP: JPA 2.0 /Hibernate 3.5 /MySQL 5.5
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie daran, dass der JPA-provider ist nicht erforderlich, um die Daten abzurufen, faul, wenn Sie geben. Es ist ein Hinweis und nicht eine Anforderung.
JPA-Spezifikation 2.0 11.1.6
Den trick wie dies zu erreichen in diesem Thema beschrieben: http://justonjava.blogspot.it/2010/09/lazy-one-to-one-and-one-to-many.html
Habe ich cheched es auf Hibernate v. 4.3.5 und JPA v. 1.5.0, PostgreSQL 9.3. Arbeitete wie ein Charme.
Beispiel:
Hinweis: Wenn Sie mithilfe von CGLib, implementieren net.sf.cglib.verwandeln.impl.InterceptFieldEnabled statt FieldHandled, mit dem gleichen Ansatz.
Meines Wissens lazy loading ist nur möglich, wenn Sie eine @OneToMany-relation (es sei denn, Sie verwenden die Klasse Weberei). Das zumindest ist wie EclipseLink erklärt es http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Basic_Mappings/Lazy_Basics, und es macht Sinn, von einer Sprache java Perspektive.
Wenn Sie
Collection ist ein interface, damit JPA problemlos verwenden können, Ihre eigenen Sammlungen Implementierung, lädt die Daten, die träge, wenn Sie starten, Durchlaufen Sie. Wenn Sie ein Objekt mit einem Feld vom Typ
byte[]
es Wert ist entweder null oder enthält es alle Daten, dies ist, wie Java funktioniert. Der einzige Weg, um circumven das ist Klasse Weben und erstellen byte-code, der aussieht wie ein byte-array, aber enthält keine Daten, bis Sie darauf zugreifen.Ich erinnere mich, dass das eine Frage eine Weile zurück (circa 2007): nämlich, warum die byte-arrays werden eifrig holte sogar tho Sie sind deklariert als faul. Anscheinend ist der Ruhezustand Jungs haben noch immer nicht das Problem behoben.
Hier einige alternativen:
Faust , versuchen Sie, kommentieren Sie Ihr Feld mit
@Lob
als gut und sehen, ob das wie erwartet funktioniert.Zweiten, tauschen Sie Ihre
byte[]
mitjava.sql.Blob
hat es convenience-Methoden zum setzen und erhalten der tatsächlichen byte-array, so dass es nicht einen großen Umgestaltung, und das sollte doch eigentlich zu lösen lazy loading Problem:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Blob.html
@Lob @Basic(fetch = FetchType.LAZY) Blob private byte[] image;
EntityManager kann nicht fortbestehen dieser Eigenschaft... bestehen alle Felder aus undimage
bleibt null. Ich bin mit der konkreten KlasseSerialBlob