public void save() {
Session session=HibernateSessionFactory.getSession(); ;
Transaction tx=null;
try{
tx=session.beginTransaction();
Customer c1=(Customer)session.get(Customer.class, new Long(3));
session.delete(c1);
System.out.println(c1.getCustomerId());
session.save(c1);
tx.commit();
session.close();
}catch(Exception e){
e.printStackTrace();
tx.rollback();
}finally{
if(session.isOpen())
session.close();
}Hibernate异常

解决方案 »

  1.   

    session.save(c1);改为session.merge(c1)
      

  2.   

    处于删除态的对象不能merge
    跟事务一点关系都没有,有事务,才可能出这个错
    原因是你这个c1关联着一个集合,你session.delete(c1),该对象处于删除态,按道理,如果你直接session.save(c1)是没有问题的,因为在session.save(c1)之前他会强制的刷新,发出DELETE 这个SQL,保证在执行save(c1)的时候,c1处于临时状态,但是你现在c1关联着一个集合,这个集合中的对象还跟你这个c1关联着,你删除c1,又重新保存c1,当然会出错。所以,你要这样做,只需要在保存c1之前保证c1的那个关联的集合是新的就可以了:
                    User u = (User) session.get(User.class, 1L);
    Set<Other> others=new HashSet<Other>();
    for(Other o:u.getOthers()){
    others.add(o);
    }
    u.setOthers(others);
    session.delete(u);
    session.save(u);