本帖最后由 sAS112UUUYY111 于 2010-07-29 09:03:28 编辑

解决方案 »

  1.   

    你用了Spring的注解式事务处理,set完了Spring自己帮你提交了
      

  2.   

    @Transactional
    看到这个注解了没有, 这个是spring对hibernate的支持,spring里面定义了对hibernate 事务的管理. 自动打开事务,和关闭事务,当你从数据库里提取数据的时候,得到了一个持久化对象,对事务提交之前,对它的操作,在事务提交之后都会被保存到数据库中..spring的事务管理,在你这个方法结束的时候关闭了事务,所以你没看到保存的语句,实际上是保存了
      

  3.   

    这是因为对象category处于托管态吗?
      

  4.   

    在hibernate中,一个持久化对象,通过set就相当于执行了update
    而你采用了@Transactional注解。自动提交事务了。所以数据被更新了!
      

  5.   

    是通过hibernate取得的对象,可以被看做是持久化对象吗?
      

  6.   

    新new出来的对象如Student stu = new Student(),就是瞬时对象,它在内存中孤立存在,它的意义是携带信息的载体,不和数据库的数据有任何关联。通过Session的save()或saveOrUpdate()方法可以把一个瞬时对象与数据库相关联,并把瞬时对象携带的信息通过配置文件所做的映射插入到数据库中,这个瞬时对象就转化成了持久对象(使用get(),load()等方法查询到的数据对象,一出场就是持久对象),并拥有和数据库记录相同的id标识(Hibernate自动将id值赋予它)。如果这时候使用delete()方法,它就会变回瞬时对象,删除了数据库与这个对象关联的记录,对象与数据库不再有任何的关联。当一个Session指定close()或clear(),evict()之后,持久对象就变成脱管对象,这时对象的id虽然拥有数据库识别值,但他们目前并不在Hibernate持久层的管理下,它与瞬时对象的本质是相同的,只不过比瞬时对象多了数据标识的id值。脱管对象的引用依然有效,对象可以继续被修改,当它重新被关联到某个新的Session上时,会再次变成持久对象(脱管状态期间的改动将被持久化到数据库上)。脱管对象拥有数据库识别值id,所以它可以通过update(),saveOrUpdate(),lock()等方法,再度与持久层关联。
      

  7.   

    Category category=this.getById(id)是从数据库中获得的,是持久化对象
      

  8.   

    楼上的讲的不错,建议你看一看hibernate的对象状态和事务,应该有能消除这个疑惑。注意其中的内存和数据库的同步。