public static void testGet(){
Session s = null;
Transaction ts = null; 
try {
s = HibUtil.getSession();
ts= s.beginTransaction();
User u = (User) s.get(User.class, 1);
System.out.println(u.getUname());
u.setUname("bbb");
ts.commit();
} finally{
if(s!=null){
s.close();
}
}
}


public static void main(String[] args) {
testGet();
}1.先设定u在表中已存在,uname原值为aaa,hibernate.cfg.xml中已配置show_sql
2.因为get()方法获取到的u对象已是持久态,所以在通过get()获取到u后,u.setUname("bbb")此行代码会生成一条update语句来同步数据库中内容
问题:
在不改变u.setUname()中set的值的情况下(如保持bbb不变),如果多次运行程序,只有第一次运行会正常生成update语句因为要把原值aaa变为bbb,为什么之后运行却不再生成update语句?持久态对象一旦调用set方法后不都是应该生成update语句同步数据到数据库中的吗?难道set方法set的值如果和持久对象中的值一样就不再生成update语句了?

解决方案 »

  1.   

    程序运行每次运行调用testGet()后,在方法最后都关闭session了,也就没有一级缓存了
      

  2.   

    hibernate没有检测到你值的改变所以没有必要发送sql,这有助于减少访问次数
      

  3.   

    你有没有开启二级缓存?如果开了对于这种get查询会在查数据库之前先查二级缓存  如果没有开二级缓存可能是hibernate还有其他机制我就不晓得了,反正就是hibernate没有检测到你值的变化值和原来一样没有必要发送sql
      

  4.   

    hibernate与数据库有很大区别,   以致于有sql经验的人,感觉不好人.分享一个ORM框架--Bee.    实体操作与DB的select,update,insert,delete紧密对应.  Bee框架,一个十分钟即可学会的ORM框架.   有着直接操作实体对象的简便性,也可以方便地自己写sql执行.
    https://blog.csdn.net/abckingaa/article/details/81176524