Java 尝试访问实体中的BLOB字段时发生org.hibernate.LazyInitializationException异常

Java 尝试访问实体中的BLOB字段时发生org.hibernate.LazyInitializationException异常,java,hibernate,spring,jsf,primefaces,Java,Hibernate,Spring,Jsf,Primefaces,我有一个懒散的初始化问题,试图使用StreamedContent类型将一个图像(BLOB)从mysql数据库加载到(Primefaces)中。我使用的是JSF+Spring+Hibernate,当我尝试加载一个映像时,我得到了org.Hibernate.LazyInitializationException。这是代码。塔克斯 下面是支持Bean: public class AccueilBean implements Serializable { private Categorie

我有一个懒散的初始化问题,试图使用
StreamedContent
类型将一个图像(BLOB)从mysql数据库加载到
(Primefaces)中。我使用的是JSF+Spring+Hibernate,当我尝试加载一个映像时,我得到了
org.Hibernate.LazyInitializationException
。这是代码。塔克斯

下面是支持Bean:

public class AccueilBean implements Serializable {  

    private CategorieService categorieService;
    private List<Categorie>  categories;
    private StreamedContent dbImg;        




public AccueilBean(){


}


@PostConstruct
public void init() {

    this.categories = new ArrayList<Categorie>();

    categories=categorieService.listerCategorie();

}

public List<Categorie> getCategories(){

    return this.categories;
}



public CategorieService getCategorieService() {
    return categorieService;
}


public void setCategorieService(CategorieService categorieService) {
    this.categorieService = categorieService;
}


public StreamedContent getDbImg() {

    InputStream dbStream = null;
     dbImg = null;

    FacesContext context = FacesContext.getCurrentInstance();
    Categorie cat = context.getApplication().evaluateExpressionGet(context, "#{cat}", Categorie.class);

    Long id = cat.getId();
    Categorie ctg_aux = categorieService.getCategorie(id);
    System.out.println(ctg_aux.getImage());
    try {
        dbStream = ctg_aux.getImage().getBinaryStream();
        dbImg = new DefaultStreamedContent(dbStream,"image/jpeg");
        } 
    catch (SQLException e) {System.out.println("erreur");}


    return dbImg;
}

}
公共类AccueilBean实现可序列化{
私人分类服务分类服务;
私人名单类别;
私有流内容dbImg;
公共Accuelbean(){
}
@施工后
公共void init(){
this.categories=新的ArrayList();
categories=categorieService.listerCategorie();
}
公共列表getCategories(){
返回此项。类别;
}
公共分类服务getCategorieService(){
返回分类服务;
}
public void setCategorieService(CategorieService CategorieService){
this.categorieService=categorieService;
}
公共流内容getDbImg(){
InputStream dbStream=null;
dbImg=null;
FacesContext context=FacesContext.getCurrentInstance();
Categorie cat=context.getApplication().evaluateExpressionGet(context,“{cat}”,Categorie.class);
Long id=cat.getId();
Categorie ctg_aux=categorieService.getCategorie(id);
System.out.println(ctg_aux.getImage());
试一试{
dbStream=ctg_aux.getImage().getBinaryStream();
dbImg=新的默认流媒体内容(dbStream,“图像/jpeg”);
} 
catch(SQLException e){System.out.println(“erreur”);}
返回dbImg;
}
}
下面是.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"     xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<body> 
<h:form>
<p:dataGrid columns="3" var="cat" value="#{accueilBean.categories}">

<p:column>

<p:graphicImage value="#{accueilBean.dbImg}" >
</p:graphicImage>
</p:column>

</p:dataGrid>
</h:form>

</body> 
</html>

这里是分类实体的映射

<class name="tn.projet.model.Categorie" table="CATEGORIE">
<id name="id" type="java.lang.Long">
<column name="ID" />
<generator class="increment" />
</id>
<property name="nom" type="java.lang.String">
<column name="NOM" />
</property>
<property name="desc" type="java.lang.String">
<column name="DESCRIPTION" />
</property>
<property name="image" type="java.sql.Blob">
<column name="IMAGE" />
</property>
<set name="produits" table="PRODUIT" inverse="false" lazy="true">
<key>
<column name="ID" />
</key>
<one-to-many class="tn.projet.model.Produit" />
</set>
</class>

我认为在上面这一行中,只加载了
ctg_aux
,但并不急于初始化。这意味着,例如,如果您在
分类中有一些集合
,仅加载
ctg_aux
不会加载集合。它将在以后实际访问该集合时延迟加载。但是在访问该集合时,会话必须是打开的(实体必须处于持久状态)。但是在这个点上,如果实体处于分离状态,您将看到这个问题

我想只要在检索实体后立即调用
ctg_aux.getImage()
categorieService.getCategorie中的方法,就可以让hibernate加载该字段

更新:

在以下方面:

<property name="image" type="java.sql.Blob">
    <column name="IMAGE" />
</property>

你能展示一下
CategorieService#getCategorie(id)
方法的主体是什么样子的吗?我已经做了,有什么建议吗?谢谢回复,问题是我有一个“映像”保存在数据库中,由hibernate映射为BLOB属性,但是当我在
datagrid
中加载Categorie,然后试图检索图像时,我的东西会话丢失了!!有什么解决方案吗?您没有访问
CategorieService#getCategorie(id)
方法的权限?@user1108701:或者您可以尝试使用类似
@Basic(fetch=FetchType.EAGER)的方法
在实体中的该字段上。如果您使用的是Hibernate API,我认为这是
FetchMode
。我可以重试ID或NAME等其他文件,但BLOB image会抛出org.Hibernate.LazyInitializationException
<property name="image" type="java.sql.Blob">
    <column name="IMAGE" />
</property>
<property name="image" type="java.sql.Blob" lazy="false">
    <column name="IMAGE" />
</property>