java - 保存子类别时出现 Hibernate 异常

标签 java hibernate servlets hibernate-criteria

我正在开发一个j2ee项目。在我的项目中,我想使用 Hibernate 标准保存产品子类别。

这是我的 servlet 代码:

try {     
    if (req.getParameter("ccategory").equals("0")) {
        ProductCategory category = new ProductCategory();//saveing product category
        category.setName(req.getParameter("cname"));
        category.setStatus(status);
        HibernateSession.save(HibernateSession.getSession(), category);

    } else {

        ProductCategory category = HibernateSession.Load(ProductCategory.class, req.getParameter("ccategory"));
        ProductSubcategory productSubcategory = new ProductSubcategory();
        productSubcategory.setProductCategory(category);
        productSubcategory.setSubcategory(req.getParameter("cname"));
        productSubcategory.setStatus(status);
        HibernateSession.save(HibernateSession.getSession(), productSubcategory);
    }

    resp.sendRedirect("index.jsp");
} catch (Exception e) {
    e.printStackTrace();
}

这是我的 session 代码方法:

public class HibernateSession {

    public static Session getSession() {
        Session session = Connection.NewHibernateUtil.getSessionFactory().openSession();
        return session;
    }

    public static void save(Session session, Object ob) {
        Transaction transaction = session.beginTransaction();
        session.save(ob);
        session.flush();
        transaction.commit();
        session.close();
    }
}

但是在保存子类别时出现错误。

org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions

org.hibernate.HibernateException: illegally attempted to associate a proxy with two open Sessions
    at org.hibernate.proxy.AbstractLazyInitializer.setSession(AbstractLazyInitializer.java:123)
    at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateProxy(StatefulPersistenceContext.java:568)
    at org.hibernate.engine.internal.StatefulPersistenceContext.reassociateIfUninitializedProxy(StatefulPersistenceContext.java:533)
    at org.hibernate.event.internal.ProxyVisitor.processEntity(ProxyVisitor.java:49)
    at org.hibernate.event.internal.AbstractVisitor.processValue(AbstractVisitor.java:124)
    at org.hibernate.event.internal.WrapVisitor.processValue(WrapVisitor.java:125)
    at org.hibernate.event.internal.AbstractVisitor.processEntityPropertyValues(AbstractVisitor.java:76)
    at org.hibernate.event.internal.AbstractSaveEventListener.visitCollectionsBeforeSave(AbstractSaveEventListener.java:372)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:273)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:194)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:125)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:209)
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:55)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:194)
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:49)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:711)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:703)
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:698)
    at hibernate.HibernateSession.save(HibernateSession.java:28)
    at Servlet.category.category_save.doPost(category_save.java:55)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

最佳答案

实际上,您需要在加载类别后添加 session.close() 方法。

ProductCategory category = HibernateSession.Load(ProductCategory.class, 
req.getParameter("ccategory")); 
session.close(); 

该问题是由于创建了两个 session 而发生的。加载类别后,您尚未关闭 session 。因此,在上面的代码中定义了解决方案。

关于java - 保存子类别时出现 Hibernate 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653927/

相关文章:

java - 即使通过 MimetypesFileTypeMap 设置内容类型后,如果下载的文件具有除 pdf 之外的任何其他扩展名,也将无法打开

java - 将初始化参数添加到 init(ServletConfig) 中的列表

java - 使用 servlet 时的 Tomcat 404

java - 有没有Android MVC框架?

java - 调用实体管理器时出现空指针

java - 使用 JPA 中的联接表从多对多关系获取结果集

java - 无法创建 sessionFactory object.org.hibernate.InvalidMappingException : Could not parse mapping document from resource Employee. hbm.xml

java - Netbeans IDE 中的文本卡在不可编辑的行中

java - 将输入流传递给视频 View

java - 可以将 ViewEntry 包装到 DominoViewEntry 的实例中吗?