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;
}
}