Hibernate 纠结的问题
当用findbyid找到某个对象,然后再用getHibernateTemplate.save(obj),为什么不报错呢,根据我的认识该id已经存在那就不能再save了呀,saveOrUpdate才对的呀。还有对某个对象调用getHibernateTemplate.save(obj)两次,为什么数据库里没有出现两条数据而是一条呢 hibernate --------------------编程问答-------------------- 把save打出语句那到数据库里面执行去。见鬼了,我还真没遇到过这种情况。 --------------------编程问答-------------------- 首先,你那个i设置成了主键了么?
另外你save之后还没有提交commit,所以数据库里面没有出现,提交之后如果设为主键的话也不会存进去,而会报错。
另外其实还是建议主键使用hibernate自带的主键生成策略。 --------------------编程问答-------------------- 估计是主键问题,也有可能是你session的3个状态处理有问题 --------------------编程问答-------------------- 你show_sql看看!!!
打印的是否是update语句! --------------------编程问答-------------------- hibernate一般会认为你这个带id的对象还在它管理的状态内,所以不会给你往数据库里再存一次了 --------------------编程问答-------------------- 如果id是主键且重复执行了save id相同的对象的话,hibernate会不会认为是重复的对象,而用后者覆盖了前者呢?(这时只是在内存中操作,未存入数据库) --------------------编程问答--------------------
这是你在哪里看到的???? --------------------编程问答-------------------- id设主键了 --------------------编程问答--------------------
发一下你的hmb.xml --------------------编程问答--------------------
看了打印出来的sql没执行insert或update语句,maybe你的是正解 --------------------编程问答--------------------
<id name="id" type="java.lang.Long">
<column name="id" precision="18" scale="0" />
<generator class="identity"></generator>
</id> --------------------编程问答--------------------
<generator class="increment"></generator>
increment是由Hibernate自动以自增的方式生成主键
不知道是不是这种原因,你的原主键ID被主键生成策略给修改了。 --------------------编程问答--------------------
如果是这样,也有可能是不覆盖,保留原样 --------------------编程问答-------------------- 建议你再重新理解一下Hibernate
"当用findbyid找到某个对象,然后再用getHibernateTemplate.save(obj),为什么不报错呢"
假设你这里没有开启事务, 使用自动提交
这时候obj是"持久态", 一个对象如果是持久态,save应该会触发flush, 一旦flush,就会去比较内存中的obj
和DB缓存中的obj的异同,因为你完全select出来, 没有任何修改, 所以这个时候应该啥也不执行。
第二个问题同, 你所问的所有问题都是内存和Hibernate缓存同步之间的问题, 希望你加深一下这方面的知识。
补充:Java , Web 开发