Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate LazyInitializationException-如何解决此问题?_Java_Hibernate_Spring_Lazy Loading - Fatal编程技术网

Java Hibernate LazyInitializationException-如何解决此问题?

Java Hibernate LazyInitializationException-如何解决此问题?,java,hibernate,spring,lazy-loading,Java,Hibernate,Spring,Lazy Loading,我有一个数据库,其中用户和地址数据存储在单独的表中。当用户登录到我的页面时,我想向他显示一个表单,他可以使用该表单更改他的用户/帐户数据。但是,我最终得到了一个异常:org.hibernate.LazyInitializationException:无法初始化代理-没有会话。无法加载地址属性。用户加载得很好,这就是我不理解的。我的地址daoimpl如下所示: @Autowired private SessionFactory sessionFactory; public void addAddr

我有一个数据库,其中用户和地址数据存储在单独的表中。当用户登录到我的页面时,我想向他显示一个表单,他可以使用该表单更改他的用户/帐户数据。但是,我最终得到了一个异常:
org.hibernate.LazyInitializationException:无法初始化代理-没有会话
。无法加载地址属性。用户加载得很好,这就是我不理解的。我的
地址daoimpl
如下所示:

@Autowired
private SessionFactory sessionFactory;
public void addAddress(Address address) 
{
        sessionFactory.getCurrentSession().save(address);
}
public void updateAddress(Address address) 
{
    sessionFactory.getCurrentSession().update(address);     
}
public List<Address> listAddress() 
{
    return sessionFactory.getCurrentSession().createQuery("from address").list();
}
public void deleteAddress(int id) 
{
    Address addr = (Address) sessionFactory.getCurrentSession().load(Address.class, id);
    if(addr != null)
    {
        sessionFactory.getCurrentSession().delete(addr);
    }
}
public Address getAddress(int id) 
{
        return (Address) sessionFactory.getCurrentSession().load(Address.class, id);    
}

为什么这样不行?为什么它适用于用户数据?

加载方法不会从数据库中获取地址。它将代理返回到未初始化的地址,假设该地址存在于数据库中。使用
Session.get
获取地址


请参见

我认为这可能是因为您没有初始化sessionfactory配置。尝试此类以帮助您创建会话工厂

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 


public class HibernateUtil { 
private static final SessionFactory sessionFactory;    
static {        
    try {         
        sessionFactory = new Configuration().configure()                  
        .buildSessionFactory();    
    } catch (Throwable ex) {          
        System.err.println("Initial SessionFactory creation failed." + ex);         
        throw new ExceptionInInitializerError(ex);       
    }   
} 

public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

}

希望这有帮助

我假设您的AddressService创建了用于加载地址代理的事务(它是一个代理,因为您使用了load()而不是get())。从AddressService返回地址时,与此事务关联的会话将关闭

当视图冲突解决程序尝试访问地址代理的属性时,没有可用的会话可用于运行数据库查询以获取属性。因此有例外


使用get()而不是load(),或者在仍在事务范围内时访问属性

< P>你可以考虑使用OpenSSIENVIEW模式,即使它不是最好的解决方案

Jeez,这个代码> .NET < /COD>编码风格伤害了我的眼睛=)你使用Spring声明性事务,如果你是,那么你可以检查(AdvSersService)是否有方法或类级别的@事务注释?谢谢。使用get()而不是load()修复了我的问题。警告:如果在获得代理之前在某处执行get操作,如果代理位于缓存中,您可能仍会获得它!
import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 


public class HibernateUtil { 
private static final SessionFactory sessionFactory;    
static {        
    try {         
        sessionFactory = new Configuration().configure()                  
        .buildSessionFactory();    
    } catch (Throwable ex) {          
        System.err.println("Initial SessionFactory creation failed." + ex);         
        throw new ExceptionInInitializerError(ex);       
    }   
} 

public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

}