2017-10-30 9 views
1

ich meine Einheit bin Angabe wie folgtorg.hibernate.LazyInitializationException: failed träge, um eine Sammlung von Rolle zu initialisieren: keine Sitzung oder einer Sitzung geschlossen wurde

package com.drishti.training.dbentity; 

import java.util.List; 

import javax.persistence.CollectionTable; 
import javax.persistence.Column; 
import javax.persistence.ElementCollection; 
import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.Table; 

import com.drishti.dacx.core.framework.ameyoentitytypes.AbstractDBEntity; 

/** 
* 
*/ 
@Entity 
@Table(name = "template") 
public class TemplateDBEntity extends AbstractDBEntity { 

    String template_name, organisationId; 

    @Column(name = "organisation_id", nullable = false) 
    public String getOrganisationId() { 
     return organisationId; 
    } 

    public void setOrganisationId(String organisationId) { 
     this.organisationId = organisationId; 
    } 

    private String templateId; 
    // private List<Integer> listOfTrainingIds; 

    private List<String> listOfTrainingIds; 

    @Id 
    @Column(name = "template_id", nullable = false) 
    public String getTemplateId() { 
     return templateId; 
    } 

    public void setTemplateId(String templateId) { 
     this.templateId = templateId; 
    } 

    @ElementCollection(targetClass = String.class) 
    @CollectionTable(name = "template_id_vs_training_id", joinColumns = @JoinColumn(name = "template_id")) 
    @Column(name = "training_id", nullable = false) 
    public List<String> getListOfTrainingIds() { 
     return listOfTrainingIds; 
    } 

    public void setListOfTrainingIds(List<String> listOfTrainingIds) { 
     this.listOfTrainingIds = listOfTrainingIds; 
    } 

    @Column(name = "template_name") 
    public String getName() { 
     return template_name; 
    } 

    public void setName(String name) { 
     this.template_name = name; 
    } 
} 

und

eine andere Tabelle ist

create table template_id_vs_training_id 
(
    template_id varchar references template(template_id) on delete cascade, 
    training_id varchar references training(training_id) on delete cascade, 
    PRIMARY KEY (template_id,training_id) 
); 

aber wenn ich die TemplateDBEntity lade liefert es mir den oben gemeldeten Fehler.

+0

Jeder spezifische Grund für die Verwendung von CollectionTable – Mudassar

+0

teilen auch den Code für Repository/Abfragen – Mudassar

Antwort

0

LazyInitializationException, wie Hibernate Dokumentation sagt:

einen Versuch Zeigt den Zugriff noch nicht abgerufenen Daten außerhalb eines Sitzungskontext. Wenn zum Beispiel eine nicht initialisierte Proxy oder Sammlung zugegriffen wird nach wurde die Sitzung

Die einzige Ursache für diese Ausnahme geschlossen listOfTrainingIds Eigenschaft ist, da es eine @ElementCollection das ist faul ist standardmäßig geladen, also entweder:

+ Stellen Sie sicher, dass Sie innerhalb einer Transaktion auf die Eigenschaft listOfTrainingIds zugreifen (Ihre Entität kann die verfügbare Sitzung zum Abrufen Ihrer Sammlung verwenden).

+ Oder machen Sie es eifrig: @ElementCollection(fetch = FetchType.EAGER), aber beachten Sie, dass jedes Mal, wenn Sie die Entität aus der Datenbank auswählen, Ihre Sammlung auch geladen wird, auch wenn Sie sie nicht benötigen, was die Leistung beeinträchtigen kann.

+ Oder verwenden fetch Schlüsselwort in Ihrem Hibernate Query (wenn Sie Abfrage verwenden Ihre Einheit zu laden):

List<TemplateDBEntity> TemplateDBEntitys = session.createQuery("select t from TemplateDBEntity t join fetch t.listOfTrainingIds", TemplateDBEntity.class).getResultList(); 

+ Oder verwenden @FetchProfile: in Ihrer Klasse:

@FetchProfile(name = "withListOfTrainingIds", 
      fetchOverrides = {@FetchProfile.FetchOverride(mode = FetchMode.JOIN, association = "listOfTrainingIds", entity = TemplateDBEntity.class)}) 
public class TemplateDBEntity extends AbstractDBEntity { 
    //... 
} 


//To get your entity 
session.enableFetchProfile("withListOfTrainingIds"); 
System.out.println(session.get(TemplateDBEntity.class, templateId)); 
session.disableFetchProfile("withListOfTrainingIds"); 

Ich bevorzuge die letzten beiden Optionen, da Hibernate eine Abfrage an die Datenbank ausführen wird, auch wenn Sie die Sammlung lazy loaded halten, was für die Leistung besser ist.

Verwandte Themen