锁定老帖子 主题:hibernate引出的几个纠结事件分析
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-27
nakupanda 写道 你插入失败后事务有回滚吗?
junit下测试的,有回滚 |
|
返回顶楼 | |
发表时间:2011-04-27
悲剧了 写道 我们项目用的是ibatis,好久没写hibernate,手生,练习中发现几个以前没有多想的问题,跟大家分享下
首先:数据库字段设为自增长的时候,比如现在数据库里面的id是1,那么我继续插入,如果失败,下次我再插入结果就是3 我删除数据库所有数据,再次强势再插入结果是4 这个数据库是怎么回事,为什么插入失败,下次再插入,他会是3,删除所有数据,再次插入会是4呢? 以前一直用,还真没想过 首先的这个问题 我感觉这个是正常的 因为你在插入数据之前 hibernate先去取得下一个主键值 这样自增序列的值肯定会增加一个值 没有什么大惊的 所以当你插入失败的时候序列值通用会自增 。。。。。。。。 |
|
返回顶楼 | |
发表时间:2011-04-27
pk3589 写道 悲剧了 写道 我们项目用的是ibatis,好久没写hibernate,手生,练习中发现几个以前没有多想的问题,跟大家分享下
首先:数据库字段设为自增长的时候,比如现在数据库里面的id是1,那么我继续插入,如果失败,下次我再插入结果就是3 我删除数据库所有数据,再次强势再插入结果是4 这个数据库是怎么回事,为什么插入失败,下次再插入,他会是3,删除所有数据,再次插入会是4呢? 以前一直用,还真没想过 首先的这个问题 我感觉这个是正常的 因为你在插入数据之前 hibernate先去取得下一个主键值 这样自增序列的值肯定会增加一个值 没有什么大惊的 所以当你插入失败的时候序列值通用会自增 。。。。。。。。 插入前去取值,属于查询出这个值,有影响吗?如果有影响,那么我查询这个主键值,查询后插入就会出现问题。这种查询在使用中很多, 那么这个自增长岂不是不能查询了,查询了后面的插入就会有问题 不知道我的理解对不对? |
|
返回顶楼 | |
发表时间:2011-04-27
自定义主建生成策略.
比如 select max(id) +1 from dul; |
|
返回顶楼 | |
发表时间:2011-04-27
最后修改:2011-04-27
刚查了一下资料, 很多人说mysql的自增字段不会随事务回滚的..
" auto_increment,作为MySQL内部自增机制实现,其按一定规则自动实现自增,并且不可回朔,即使回滚,如delete般,ID已经自增过,只会继续增长,不可能跟着回滚和删除操作而减小,否则就不叫自增了。 不仅MySQL,Oracle数据库亦然。 " http://bbs.phpchina.com/viewthread.php?tid=188731&rpid=1573813&ordertype=0&page=1#pid1573813 |
|
返回顶楼 | |
发表时间:2011-04-27
最后修改:2011-04-27
nakupanda 写道 刚查了一下资料, 很多人说mysql的自增字段不会随事务回滚的..
" auto_increment,作为MySQL内部自增机制实现,其按一定规则自动实现自增,并且不可回朔,即使回滚,如delete般,ID已经自增过,只会继续增长,不可能跟着回滚和删除操作而减小,否则就不叫自增了。 不仅MySQL,Oracle数据库亦然。 " http://bbs.phpchina.com/viewthread.php?tid=188731&rpid=1573813&ordertype=0&page=1#pid1573813 原来如此。谢了 |
|
返回顶楼 | |
发表时间:2011-04-27
抛出异常的爱 写道 自定义主建生成策略.
比如 select max(id) +1 from dul; 这个触发是每次插入数据,不管失败与否,看来基本明白了是怎么回事 哥们能把第二个问题给解释下吗 |
|
返回顶楼 | |
发表时间:2011-04-27
全删怎么执行sql的, delete from tablename::??
|
|
返回顶楼 | |
发表时间:2011-04-28
无盐以对
id的问题和 hibernate 没有关系。 new Brand, remove 是基本的 Object的状态的问题。 不想贬低。。。不过这是基本概念, 看书应该细致一点。 |
|
返回顶楼 | |
发表时间:2011-04-28
这个数据库暂时估计是oracle
hibernate配置文件中主键用的估计是oracle中的sequence 当操作主键一次,主键ID会自增一次,不论是操作增加还是查询,报错报错。所以会出现没增添一次就会增加,如果查询需要不增加主键需要查询临时表dual |
|
返回顶楼 | |