当前位置:编程学习 > JAVA >>

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会不会认为是重复的对象,而用后者覆盖了前者呢?(这时只是在内存中操作,未存入数据库) --------------------编程问答--------------------
引用 6 楼 dracularking 的回复:
如果id是主键且重复执行了save id相同的对象的话,hibernate会不会认为是重复的对象,而用后者覆盖了前者呢?(这时只是在内存中操作,未存入数据库)


这是你在哪里看到的???? --------------------编程问答--------------------
引用 2 楼 AA5279AA 的回复:
首先,你那个i设置成了主键了么?
另外你save之后还没有提交commit,所以数据库里面没有出现,提交之后如果设为主键的话也不会存进去,而会报错。
另外其实还是建议主键使用hibernate自带的主键生成策略。
id设主键了 --------------------编程问答--------------------
引用 8 楼 fenghua588 的回复:
引用 2 楼 AA5279AA 的回复:首先,你那个i设置成了主键了么?
另外你save之后还没有提交commit,所以数据库里面没有出现,提交之后如果设为主键的话也不会存进去,而会报错。
另外其实还是建议主键使用hibernate自带的主键生成策略。id设主键了

发一下你的hmb.xml --------------------编程问答--------------------
引用 6 楼 dracularking 的回复:
如果id是主键且重复执行了save id相同的对象的话,hibernate会不会认为是重复的对象,而用后者覆盖了前者呢?(这时只是在内存中操作,未存入数据库)

看了打印出来的sql没执行insert或update语句,maybe你的是正解 --------------------编程问答--------------------
引用 9 楼 AA5279AA 的回复:
引用 8 楼 fenghua588 的回复:引用 2 楼 AA5279AA 的回复:首先,你那个i设置成了主键了么?
另外你save之后还没有提交commit,所以数据库里面没有出现,提交之后如果设为主键的话也不会存进去,而会报错。
另外其实还是建议主键使用hibernate自带的主键生成策略。id设主键了
发一下你的hmb.xml

<id name="id" type="java.lang.Long">
            <column name="id" precision="18" scale="0" />
            <generator class="identity"></generator>
        </id> --------------------编程问答--------------------
引用 11 楼 fenghua588 的回复:
引用 9 楼 AA5279AA 的回复:引用 8 楼 fenghua588 的回复:引用 2 楼 AA5279AA 的回复:首先,你那个i设置成了主键了么?
另外你save之后还没有提交commit,所以数据库里面没有出现,提交之后如果设为主键的话也不会存进去,而会报错。
另外其实还是建议主键使用hibernate自带的主键生成策略。id设主键了
发一下你的hmb.……


<generator class="increment"></generator>

increment是由Hibernate自动以自增的方式生成主键

不知道是不是这种原因,你的原主键ID被主键生成策略给修改了。 --------------------编程问答--------------------
引用 10 楼 fenghua588 的回复:
引用 6 楼 dracularking 的回复:如果id是主键且重复执行了save id相同的对象的话,hibernate会不会认为是重复的对象,而用后者覆盖了前者呢?(这时只是在内存中操作,未存入数据库)
看了打印出来的sql没执行insert或update语句,maybe你的是正解

如果是这样,也有可能是不覆盖,保留原样 --------------------编程问答-------------------- 建议你再重新理解一下Hibernate
"当用findbyid找到某个对象,然后再用getHibernateTemplate.save(obj),为什么不报错呢"
假设你这里没有开启事务, 使用自动提交
这时候obj是"持久态", 一个对象如果是持久态,save应该会触发flush, 一旦flush,就会去比较内存中的obj
和DB缓存中的obj的异同,因为你完全select出来, 没有任何修改, 所以这个时候应该啥也不执行。

第二个问题同, 你所问的所有问题都是内存和Hibernate缓存同步之间的问题, 希望你加深一下这方面的知识。
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,