1.hibernate数据的三个状态

hibernate中有个缓存机制,在使用commit方法之前,其会在自己的缓存中保存一份最终需要写入数据库的对象。

1.持久化状态:数据session所管理着,在缓存中保存着一份数据。

2.瞬时状态:数据库中没有该数据,并且session的缓存中没有该数据。

3.离线状态:数据库中有该数据,但是session中的缓存没有该数据。

2.hibernate执行数据库写入

所有的数据库写入操作都是在commit中进行的,

1.当一个数据是瞬时状态,调用save能将其转化为持久化状态。由此操作,commit中会进行一个插入sql语句。

2.load的数据直接就是持久化的,当一个数据是持久化状态。在在commit时,会自动将该数据和缓存中的数据进行比较如果有变化,就会自动执行一条更新sql语句。

3.当一个数据是离线状态,update能将其变成持久化状态。

4.当一个数据是离线状态和持久化状态时,delete能将其变成瞬时状态。

5.saveOrUpdate操作对于一个数据来说:当为离线状态就使用update,当是瞬时状态就会执行save。

6.注意当数据的id已经确定了,那么hibernate会自动认为其是离线状态,即使数据库中没有 这条数据。

7.hibernate的缓存中是根据数据的id来区分是否是相同的数据的,其缓存中不能有两条id相同的数据。merge方法能将后面一条将要变成持久化状态的数据合并到前面的数据中。

8.clear方法能清空hibernate缓存中的数据,最后在commit中不会进行任何操作。

9.总结:对于某一条数据的一整个流程的操作,在commit之前都只是改变session缓存中的数据。最终的sql写入是在commit中进行的。session缓存中数据的索引是由id决定的。

对于一条有id的数据来说。

进行save操作,会将其变成持久化状态。

save后没有再对数据进行操作

如果id在数据库中没有,那么commit中会使用插入sql。即之前是瞬时状态

如果在数据库中有,那么会报错,因为插入了重复的数据。

save后对数据进行了操作:

id没改变,数据改变了,在commit中会将数据和缓存的数据进行比较,然后先插入后更新。

id,数据没改变,直接插入数据。

id改变了,这时无论数据有没有变,都会报错。即数据和缓存中的数据存在某种联系。一般情况下id不可改变

进行update操作,会将其变成持久化状态。

update后没有在对数据进行操作:

id在数据库中没有,那么commit时会报错。因为更新了没有的数据。 id在数据库中有,那么会更新数据。即之前是离线状态 update后又对数据进行了操作。

id没改变,数据改变了。在commit中会将数据和缓存的数据进行比较,将数据的改变值给缓存的数据,然后将缓存的数据用更新sql写入。注意就算改变后的数据和数据库中的数据是一样的,还是会执行更新sql 2.id,数据没改变,直接更新。 id改变,同save会报错。 进行delete操作,会将其变成瞬时状态。

delete后没对数据进行操作:

id在数据库中有,在commit中使用查找和删除sql。 2.id在数据库中没有,在commit中使用查找sql。 2.delete后所有对数据的操作都不会影响到delete操作。 3.delete值对id敏感,也就是说只判断id,其他数据不管。 4.进行load操作,会将其变成持久化状态

如果id不存在会报错。 2.load后,由于其已经持久化,所以不能改变id。 3.load后,如果改变了数据,在commit中会进行更新sql。 5.进行saveOrUpdate,会将其变成持久化状态。

无论id有没有都不会再报错。有则更新,无则插入。 2.其后续的操作就是save和update的选择。 2.对于没有id的数据来说

save,会变成持久化状态,由于一般的表id是自增的,所以会自动加上id,添加一条数据

save后不操作数据,commit中只执行插入sql。 2.save后操作数据

id变,数据不变。报错,因为id会初始化为0,这时候就和前面一样报错。 2.id不变,数据变。commite中会执行插入和更新sql,但是最后由于找不到id,数据库会回滚。 3.id不变,数据不变。commit中只执行一条插入sql。 2.update:由于没有id所以会报错或者说id=0,找不到数据。 3.delete:无 4.load:无 5.saveOrUpdate:由于id=0,所以最后变成了没有id的save操作。

3.延迟加载

load,只执行load的时候,不对结果进行操作,那么就不会操作数据库;即不用对象就不取对象,此时的对象是代理对象,其中只有id。只有获取其他数据的时候,才会去数据库中取。

由于load是懒加载,所以如果在操作对象之前,session就已经关闭了的话,那么就会报错。 get,和load相反,直接数据库获取对象。

4.多对一(单向)

1.在多的那边加一个一的实体,并在配置文件中配置。

2.当多的这边使用懒加载时,其内部的一也是采用懒加载的策略

3.只有一在已经save或者数据库中有值的时候,多的一方才能关联。

5.一对多(单向)

6.HQL

1.HQL是基于对象查询。from XXX(对象名)

2.from XXX where x like ?(这个在后面链式结构setParamter(0,“%a%”))。

3.从XXX中查询x为a的对象。

本文数据库(综合)相关术语:系统安全软件

主题: Hibernate数据数据库删除
分页:12
转载请注明
本文标题:Hibernate学习笔记 Hibernate Hibernate笔记 Hibernate三个状态 Hibernate缓存机制
本站链接:http://www.codesec.net/view/519842.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(49)