【问题标题】:Hibernate: Object deleted but still can be loaded by HibernateHibernate:对象已删除,但仍可以由 Hibernate 加载
【发布时间】:2013-08-23 19:50:06
【问题描述】:

即使在我删除了对象之后我还能加载它并打印它的 ID,这似乎很荒谬。这是我用来从 Prof 实体中检索数据的类:

public class ProfCrud {
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session ; 

 public ArrayList<Object> findProfByProfId( int id){
     session = sessionFactory.openSession();  
    Query Q = session.getNamedQuery("findProfByProfId");
    Q.setLong("id", id);
    List<Object> objet = Q.list();
    session.close(); 
    return (ArrayList<Object>) objet;   
}
public void deleteProfByProfId(int id){
    ProfCrud pc= new ProfCrud();

            session = sessionFactory.openSession();  
    session = HibernateUtil.getSessionFactory().openSession();
    Transaction transaction = null;
    try {
        transaction = session.beginTransaction();     
        Prof c = (Prof) pc.findProfByProfId(id).get(0);
                session.delete(c);
            transaction.commit();
    } catch (HibernateException e) {
        transaction.rollback();
        e.printStackTrace();
    } finally {
        session.close();
    }   

    System.out.println(((Prof) pc.findProfByProfId(id).get(0)).getId());
}

}

【问题讨论】:

  • 您的外部范围(您打印教授 ID 的范围)是否有交易?您是否有可能看到可重复读取隔离的结果?
  • 我不认为是这种情况,我尝试将其打印在方法之外,但它还是给出了结果。
  • 并且在方法之外是在任何外部事务或会话之外正确吗? findProfByProfId 使用的会话在哪里创建?
  • @Pace 我不知道,如果你能提供帮助,我编辑了帖子并添加了整个课程
  • 看起来您在 deleteProfByProfId 方法开始时打开了两次会话,如果您删除其中一个打开的会话调用,问题会消失吗?

标签: java mysql sql hibernate


【解决方案1】:

就在打印之前,我打开了一个会话,启动了一个事务并关闭了它。现在我无法加载对象。我不知道为什么,但如果有人能进一步澄清它,我将不胜感激。

session = sessionFactory.openSession();  
    session = HibernateUtil.getSessionFactory().openSession();
    transaction = session.beginTransaction();     
    transaction.commit();
    session.close();

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多