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决定的。
- 1.对于一条有id的数据来说。
- 1.进行save操作,会将其变成持久化状态。
- 1.save后没有再对数据进行操作
- 1.如果id在数据库中没有,那么commit中会使用插入sql。即之前是瞬时状态
- 2.如果在数据库中有,那么会报错,因为插入了重复的数据。
- 2.save后对数据进行了操作:
- 1.id没改变,数据改变了,在commit中会将数据和缓存的数据进行比较,然后先插入后更新。
- 2.id,数据没改变,直接插入数据。
- 3.id改变了,这时无论数据有没有变,都会报错。即数据和缓存中的数据存在某种联系。一般情况下id不可改变
- 1.save后没有再对数据进行操作
- 2.进行update操作,会将其变成持久化状态。
- 1.update后没有在对数据进行操作:
- 1.id在数据库中没有,那么commit时会报错。因为更新了没有的数据。
- 2.id在数据库中有,那么会更新数据。即之前是离线状态
- 2.update后又对数据进行了操作。
-
- id没改变,数据改变了。在commit中会将数据和缓存的数据进行比较,将数据的改变值给缓存的数据,然后将缓存的数据用更新sql写入。注意就算改变后的数据和数据库中的数据是一样的,还是会执行更新sql
- 2.id,数据没改变,直接更新。
- 3.id改变,同save会报错。
-
- 1.update后没有在对数据进行操作:
- 3.进行delete操作,会将其变成瞬时状态。
- 1.delete后没对数据进行操作:
- 1.id在数据库中有,在commit中使用查找和删除sql。
- 2.id在数据库中没有,在commit中使用查找sql。
- 2.delete后所有对数据的操作都不会影响到delete操作。
- 3.delete值对id敏感,也就是说只判断id,其他数据不管。
- 1.delete后没对数据进行操作:
- 4.进行load操作,会将其变成持久化状态
- 1.如果id不存在会报错。
- 2.load后,由于其已经持久化,所以不能改变id。
- 3.load后,如果改变了数据,在commit中会进行更新sql。
- 5.进行saveOrUpdate,会将其变成持久化状态。
- 1.无论id有没有都不会再报错。有则更新,无则插入。
- 2.其后续的操作就是save和update的选择。
- 1.进行save操作,会将其变成持久化状态。
- 2.对于没有id的数据来说
- 1.save,会变成持久化状态,由于一般的表id是自增的,所以会自动加上id,添加一条数据
- 1.save后不操作数据,commit中只执行插入sql。
- 2.save后操作数据
- 1.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操作。
- 1.save,会变成持久化状态,由于一般的表id是自增的,所以会自动加上id,添加一条数据
- 1.对于一条有id的数据来说。
3.延迟加载
- 1.load,只执行load的时候,不对结果进行操作,那么就不会操作数据库;即不用对象就不取对象,此时的对象是代理对象,其中只有id。只有获取其他数据的时候,才会去数据库中取。
- 1.由于load是懒加载,所以如果在操作对象之前,session就已经关闭了的话,那么就会报错。
- 2.get,和load相反,直接数据库获取对象。
4.多对一(单向)
- 1.在多的那边加一个一的实体,并在配置文件中配置。
- 2.当多的这边使用懒加载时,其内部的一也是采用懒加载的策略
- 3.只有一在已经save或者数据库中有值的时候,多的一方才能关联。
5.一对多(单向)
6.HQL
- 1.HQL是基于对象查询。from XXX(对象名)
- 2.from XXX where x like ?(这个在后面链式结构setParamter(0,“%a%”))。从XXX中查询x为a的对象。
- 3.