Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Hibernate recuperare informazioni Lazy

    Ho un oggetto zona importato come lazy in Azienda
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "citta")
    public Zona getZona() {
    return this.zona;
    }

    public void setZona(Zona zona) {
    this.zona = zona;
    }

    però se lancio

    prova.getAzienda().getZona().getZona_1();

    mi restituisce un errore
    org.hibernate.LazyInitializationException: could not initialize proxy - no Session

    cosa posso fare per risolverlo? come si fa ad ottenere un oggetto dichiarato lazy??

    Ps. non posso mettere l'oggetto non lazy perché opero su grandi quantità di dati.

  2. #2
    Ciao cozzalonero,
    Il Lazy loading prevede che la relazione venga "popolata" durante il caricamento dell'owner della relazione. Nel tuo caso l'owner della relazione è l'oggetto Azienda, quindi quando effettui la query per recuperare l'azienda devi anche chiamare il metodo "prova.getAzienda().getZona().getZona_1();" in modo da effettuare il caricamento Lazy.

  3. #3
    anche se non saprei come fare.... non posso farlo perchè quando andrei a recuperare la lista di 10000 aziende si porta dietro tutte informazioni inutili appesantendo l'applicazione.

    tra l'altro la chiamata prova.getAzienda().getZona().getZona_1(); fino al .getZona() funziona anche se restituisce un oggetto praticamente vuoto .... c'è un modo per far riempire questo oggetto in base all'esigenza?

    ho letto da qualche parte che basta avere la sessione aperta di hibernate ... però non so come si fa a tenere una sessione aperta.... HELP!!!!

  4. #4
    Se non vuoi valorizzare tutta la relazione perchè non fai un query apposita per tirare su solo le aziende che ti interessano ?
    Per quanto riguarda la sessione guarda un pò questo link è spiegato molto bene.

  5. #5
    dal link ho capito che bisogna tenere la sessione aperta anche in fase di view

    ...The second is to keep the session open until the view is done rendering (commonly referred to as 'Open Session In View')....
    ora... come si fa a tenere una sessione aperta in visualizzazione?

    vi posto il mio DAO

    codice:
    @SuppressWarnings("unchecked")
    	public List<Fattura> findLastFatturaByAziendaDataMyAzienda(final int idAzienda,
    			final int annoFattura, final int idMyAzienda) throws RuntimeException {
    
    		final String queryString =
    				"select f "
    						+ "from Fattura f "
    						+ "where f.azienda.id = :idAzienda "
    						+ "and year(f.data) = :annoFattura "
    						+ "and f.myAzienda.id = :idMyAzienda "
    						+ "and f.numero in (select max(f.numero) from Fattura f where f.azienda.id = :idAzienda and year(f.data) = :annoFattura and f.myAzienda.id = :idMyAzienda)";
    		return getJpaTemplate().executeFind(new JpaCallback() {
    			public Object doInJpa(EntityManager em) throws PersistenceException {
    				Query query = em.createQuery(queryString);
    				query.setParameter("idAzienda", idAzienda);
    				query.setParameter("annoFattura", annoFattura);
    				query.setParameter("idMyAzienda", idMyAzienda);
    				return query.getResultList();
    			}
    		});
    	}

    per poi utilizzarlo attraverso
    fattura.getAzienda().getZona().getZona_1();

  6. #6
    Puoi ottenere la sessione chiamando i seguenti metodi:
    SessionFactory sf = HibernateUtil.getSessionFactory();
    Session session = sf.getCurrentSession():
    prima di eseguiere la query.
    Subito dopo (getResultList), devi valorizzare la tua relazione chiamando
    getAzienda().getZona().
    Ti ricorod che effettuando questa chiamata verrano fetchate tutte le zone collegate all'azienda.

  7. #7

    ottenere un oggetto LAZY con hibernate e jpa

    come posso ottenere un oggetto con l'annotation Lazy? parlo in esecuzione....

    faccio un esempio, ho la tabella azienda collegata con la tabella richiestaInviata

    codice:
    @OneToMany(cascade = CascadeType.ALL, fetch =FetchType.LAZY , mappedBy = "azienda")
    	public Set<RichiestaInviata> getRichiestaInviatas() {
    		return this.richiestaInviatas;
    	}
    se dall'oggetto azienda chiamo il metodo getRichiestaInviatas(), non mi restituisce le richieste relative all'azienda proprio perché è lazy.

    come faccio ad ottenere questo?

    PS. non posso mettere tutti EAGER altrimenti si porta dietro tutto il DB

  8. #8
    Non è colpa del FetchType LAZY se chiamando getRichiestaInviatas non ti viene restituito niente. Usando lazy tu dici solo ad hibernate di leggere i record RichiestaInviata dal DB quando chiami il metodo. Il problema è un altro: controlla se hai sbagliato la query.

    Comunque quell'annotation va messa al campo richiestaInviatas, non al metodo che lo restituisce.
    lolide
    Java Programmer

    Informati

  9. #9
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480

    Moderazione

    Ho unito le discussioni aperte sullo stesso argomento.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.