@Basic (fetch = FetchType.LAZY) ne fonctionne pas?
J'utilise JPA (Hibernate) avec le Ressort.
Quand je veux lazy load un Stirng bien j'utilise cette syntaxe:
@Lob
@Basic(fetch = FetchType.LAZY)
public String getHtmlSummary() {
return htmlSummary;
}
Mais quand je regarde le code sql que hibernate crée, il semble que cette propriété n'est pas paresseux chargé? J'ai aussi l'utilisation de cette classe org.mise en veille prolongée.outil de.de l'instrument.javassist.InstrumentTask dans le script ANT pour instrument de cette propriété, mais il semble qu'il ne fonctionne pas.
S'il vous plaît aider moi.
Khosro.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Paresseux
Lob
chargement nécessiterait instrumentation du bytecode pour fonctionner correctement, de sorte qu'il n'est pas disponible par défaut dans toute implémentation JPA, je suis conscient de.Votre meilleur pari est de mettre le Lob à une entité distincte, comme
HtmlSummary
et l'utilisation d'un paresseusement chargé one-to-one de l'association.Utilisation FieldHandled avec
@Basic(fetch=FetchType.LAZY)
travaux:- Je utiliser Hibernate4 h2database.Je suis sûr que le chargement paresseux peut fonctionner correctement mon code.
Mise en veille prolongée:
select user0_.uid as uid1_0_0_, user0_.age as age2_0_0_, user0_.uname as uname4_0_0_ from User user0_ where user0_.uid=?
Mise en veille prolongée:
select user_.img as img3_0_ from User user_ where user_.uid=?
si l'utilisation
repository.save(User)
pour ajouter un nouvel Utilisateur sera ok, mais la mise à jour d'un Utilisateur va lancer une exceptionjava.lang.ClassCastException: org.hibernate.bytecode.instrumentation.spi.LazyPropertyInitializer$1 cannot be cast to java.sql.Blob
Je suggère d'utiliser
repository.delete(userid)
avantrepository.save
dans un transactionnelles, alors cela fonctionnera très bien.Tout d'abord, vous devez savoir que la JPA spécifications spécifie clairement le PARESSEUX n'est qu'une indication pour JPA fournisseurs, il n'est donc pas une exigence obligatoire.
De base type de chargement différé de travail, vous devez activer le bytecode d'amélioration de la et de définir explicitement le
enableLazyInitialization
propriété de configuration detrue
:à partir de la spécification JPA ils disent que même si vous utilisez d'annoter un bien être récupérés paresseusement, ce n'est pas garanti d'être appliqué, de sorte que les propriétés peuvent ou ne peuvent pas être chargés paresseusement (dépend du responsable de l'implémentation de JPA), cependant si vous indiquez que vous devez venir le chercher avec Impatience alors la JPA du maître d'œuvre doit charger avec impatience.
Ligne du bas: @Basic(fetch = FetchType.PARESSEUX) peut fonctionner ou pas, dépend de la JPA du maître d'œuvre.
Je pense qu'il serait semblable à EclipseLink, vous devez avoir activé le tissage sinon, l'extraction de paramètre prend aucun effet.
Le tissage implique le bytecode d'accès.
Cela pourrait aider: https://stackoverflow.com/a/18423704/7159396
Chargement différé ne s'applique qu'à des références à d'autres entités ou des collections d'entités. Elle ne s'applique pas à des valeurs comme String ou int.