【发布时间】:2009-04-21 14:36:42
【问题描述】:
我在 NetBeans 中使用 Hibernate。我正在使用 NetBeans 的 Hibernate 插件附带的 hibernate util 类来获取当前会话。也就是说,我正在使用以下代码来获取我当前的会话:
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
但是当我尝试延迟获取任何东西时,它会出现以下错误:
org.hibernate.LazyInitializationException: 延迟初始化课程失败。
我正在使用 2 DAO。一个是 Abstract DAO,第二个是扩展 AbstractDAO 的 CoutseDAO。 代码如下
public class AbstractDAO<T> {
Session session = null;
public AbstractDAO()
{
this.session = HibernateUtil.getSessionFactory().getCurrentSession();
}
public void createObject(T object)
{
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.save(object);
tx.commit();
}
catch (HibernateException e)
{
tx.rollback();
throw new DataAccessLayerException(e);
}
finally
{
}
}
public void updateObject(T object )
{
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.update(object);
tx.commit();
}
catch (HibernateException e)
{
tx.rollback();
throw new DataAccessLayerException(e);
}
finally
{
}
}
public void deleteObject(T object )
{
Transaction tx = null;
try
{
tx = session.beginTransaction();
session.delete(object);
tx.commit();
}
catch (HibernateException e)
{
tx.rollback();
throw new DataAccessLayerException(e);
}
finally
{
}
}
}
第二课如下
public class CourseDAO extends AbstractDAO<Course>{
public CourseDAO()
{
super();
}
public Course findByID(int cid){
Course crc = null;
Transaction tx = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery("from Course as course where course.cid = "+cid+" ");
crc = (Course) q.uniqueResult();
tx.commit();
}
catch (HibernateException e)
{
e.printStackTrace();
tx.rollback();
throw new DataAccessLayerException(e);
}
finally
{
}
return crc;
}
public List<Course> findAll(){
List lst = null;
Transaction tx = null;
try {
tx = session.beginTransaction();
Query q = session.createQuery("from Course ");
lst = q.list();
tx.commit();
}
catch (HibernateException e)
{
e.printStackTrace();
tx.rollback();
throw new DataAccessLayerException(e);
}
finally
{
}
return (List<Course>)lst ;
}
}
【问题讨论】:
-
您应该发布用于加载 DAO 的完整代码,而不仅仅是您检索会话的方式。
-
这似乎是对 DAO 的可怕误用,以完成 Hibernate 打算做的工作。
createObject( T object),在 Hibernate 应该在哪里工作的地方写查询,事务边界在 DAO 方法边界处终止。整个事情完全错了,这绝对是一个骗局。摆脱所有 DAO 的东西并直接使用Hibernate。