2017-06-21 3 views
-1

J'utilise un fichier modèle à savoir Document.java et Document.hbm.xml à partir d'un fichier jar.Obtention d'une exception d'initialisation paresseuse - aucune session lors de l'accès aux propriétés d'un objet modèle

Cette classe de document a un objet:

class Document{ 

private Signature signature; 

// other fields 
// getter setters 

} 

avec cartographie HBM comme suit:

<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.Signature"/> 

Maintenant que je suis accès à ces fichiers de jar donc je préfère ne pas les changer.

Je suis SOUSCRIPTION l'objet de document comme suit:

Query qry = getSessionFactory().getCurrentSession().createQuery("from 
Document where id = :id"); 
qry.setParameter("id" , id); 
return (Document)qry.list().get(0); 

Mais maintenant, quand je prends un objet Signature par le code suivant:

J'ai une classe utilitaire Utils.java donc je suis en train d'accéder comme:

Utils utils = new Utils(); 

utils.getSignatures(document); 

et cette méthode getSignatures dans la classe Utils est

public Signatures getSignatures (Document document){ 

Signature sign = document.getSignature(); 

// working on sign object 

return sign; 
} 

Alors maintenant, comme dans le code ci-dessus chaque fois que je fais document.getSignature() Je reçois l'erreur suivante:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

+0

S'il vous plaît ajouter un morceau de code où vous obtenez l'exception. Accédez-vous à cet objet dans une transaction? – ledniov

+0

Monsieur, j'ai mis à jour la question – Tarun

Répondre

0

Vous devez soit obtenir vos signatures alors que vous avez une session ouverte comme:

Document document = session.get(whatEverID); 
Signature signature = document.getSignature(); 

Ou chercher avec impatience vos signatures comme:

<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.Signature" fetch="eager"/> 

Ou join fetch vos signatures comme:

Criteria criteria = createCriteria().setFetchMode("signature", FetchMode.JOIN); 

Je ne sais pas quelle version de mise en veille prolongée (ou une autre implémentation JPA) que vous utilisez donc des codes que j'ai fournies peuvent varier.

0

Le chargement paresseux nécessite une transaction. En gros, votre flux de travail typique des transactions Hibernate devrait ressembler à ceci:

Session session = null; 
Transaction tx = null; 

try { 
    session = getSessionFactory().getCurrentSession(); 
    tx = session.beginTransaction(); 

    // doSomething(session); 

    tx.commit(); 
} catch(RuntimeException e) { 
    try { 
     tx.rollback(); 
    } catch(RuntimeException rollbackException) { 
     log.error("Couldn’t roll back transaction", rollbackException); 
    } 
    throw e; 
} finally { 
    if(session!=null) { 
     session.close(); 
    } 
} 

lire également this post sur les types aller chercher dans la mise en veille prolongée.

Pour plus d'informations sur le chargement paresseux, reportez-vous à la référence this question.