频道栏目
首页 > 资讯 > 其他综合 > 正文

Hibernate配置文件参数解释

17-04-27        来源:[db:作者]  
收藏   我要投稿

1,entity生命周期、状态、session的联系 对象的状态分为临时状态、持久化状态 临时状态:new出来的对象,常见的普通对象 持久化状态:持久的实例在数据库中有对应的记录,并拥有一个持久化标识 游离状态:与持久对象关联的 Session 被关闭后,对象就变为脱管对象。对脱管对象的引用依然有效,对象可继续被修改。

对象状态与session的关系: 1,临时状态与session已经没有关系了,是一个不存在数据库的状态 2,save、saveOrUpdate、merge、lock都可以获得一个持久化状态的对象,但是并不意味着一定会存在与数据库中。在合适的情况下会保存在数据库中。 3,同样的,delete也不一定会导致对象从数据库中脱离。 4,session的save、saveOrUpdate、merge的作用是将对象保存到session中,这时,session中会保存这个对象,但是这个时候不意味着已经把数据的变化传到数据库中。session就是一种缓存机制,如果需要将数据的改变传到数据库中,那就需要将session中的数据传输到数据库。 5, 同步时顺序: ①所有对实体的insert操作 ②对实体的update操作 ③对集合的删除操作 ④对集合的删除、更新、插入的SQL语句 ⑤对所有集合的insert操作 ⑥对实体的delete操作

首先看下配置文件: 配置文件中使用的是HibernateTransactionManager来管理事务。 ①对于insert、update、delete、save四个开头的函数,我们配置为propagation="REQUIRED"。意思是对于以这四个开头的,需要开启事务。 ②对于get、find、selete、load四个开头的函数,我们配置为propagation="SUPPORTS" read-only="true",意思是说如果有事务,我们就支持事务,没有就不使用事务,而且是“只读”的。 这里只读的是有一个历史问题,在早期如果置 read-only="true",那么HibernateTransactionManager会session.setFlushMode(FlushMode.NEVER);但是现在会使用session.setFlushMode(FlushMode.MANUAL);也就是说,如果使用了read-only="true",依然可以通过手动flush,完成对数据库的修改。 ③对于其他开头方法使用默认方式,默认方式的配置是propagation="SUPPORTS" read-only="false"。 ④这三种开头的都可以将insert、update、delete、save操作同步到数据库。 对于get、find、selete、load四个开头的函数 对于save、saveOrUpdate、delete操作,如果不手动flush,不会将修改同步到数据库中,如果flush会立即对数据库造成修改。 对于insert、update、delete、save开头的函数 对于save、saveOrUpdate、delete操作,不需要手动flush,在函数即将结束时,会将修改同步到数据库中。 如果手动flush,也不会立即对数据库造成修改。 对于默认 对于save、saveOrUpdate、delete操作,不需要手动flush,在函数即将结束时,会将修改同步到数据库中。

手动flush,会立即将修改同步到数据库中。

原因如下: flush、read-only问题, 如果read-only="true",需要手动flush,否则,由于没有手动flush,数据的修改将不会同步到数据库中。 如果read-only="false",那么不需要手动flush,就可以将数据的修改同步到数据库中。read-only="false",相当于FlushMode.AUTO。 flush是指将session中缓存的修改操作同步到数据库的缓存中,并不是同步到数据库中,并不是对数据库立即造成实质修改。 propagation 如果propagation="REQUIRED",会自动开启事务,它会保证修改的事务性。 如果propagation="SUPPORTS",有事务就会使用事务,否则就不适用事务。 如果处于事务中,手动flush就会将修改同步到数据库的缓存中,但是不会将修改同步到数据库中。因为,为保证事务性,在所有操作没有全部提交到数据库时,并不会立即将操作执行。如果现在就开始修改,如果不锁全库,就可能破坏事务性,如果锁全库,那代价高的可怕(这一句是自己理解的,暂没有查证)。 如果不处于事务中,手动flush就会将修改同步到数据库的缓存中,而且会立即修改到数据库中。

相关TAG标签
上一篇:SQL Server 2008/2008 R2 定期自动备份数据库
下一篇:mysql问题:1、本地连接不了mysql服务器,连接3306端口失败
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站