hibernate学习笔记
1.Hibernate里不对对象或集合对象重载toString方法,不然编译错误 。Stackoverflow错误 栈溢出
2.什么是维护关联关系:
一对多时候 设置外键的值
多对多时候 就是插入或删除中间表的记录
3对象的状态:
临时状态:
与数据库没有对应,跟Session没有关联。
一般是新new出的对象。
持久化状态:
对象在Session的管理之中,最终会有对应的数据库记录。
特点:
a,有OID
b,对对象的修改会同步到数据库。
游离状态:
数据库中有对应记录,但对象不在Session管理之中。
修改此状态对象时数据库不会有变化。
4.主键id的生成
<id name="id">
5.数据库sql的四个级别:
读未提交 1 0001
读已提交 2 0010
可重复度 4 0100
串行化(不可并发) 8 1000
6.一对一:
外键约束 + 唯一性约束
比较特殊只有有外键方的一方才能维护关联关系
所有解除关联是,没外键的一方解除无效。
基于外键的一对一
基于主键的一对一
person
- 在having中不能使用列别名,order by 可以用
8.java中为什么要给类使用代理,有什么好处
http://www.iteye.com/problems/15304
9.懒加载:
也叫延迟加载,不是在执行获取操作时马上生成SQL,而是在第一次使用时生成SQL。
分成两种:
类级别的:
<class ... lazy="true/false">
属性级别的:
<set/list/map/bag ... lazy="...">
<many-to-one ... lazy="...">
<one-to-one ... lazy="...">
在使用懒加载特性时,可能会有LazyInitializationException异常:
原因:
真正的去获取数据时,Session已经没有了。
解决办法:
方式一:让Session在真正加载后再关闭。
方式二:或是在Sessoin关闭前执行Hibernate.initialize(department.getEmployees());
extra策略:(加强懒加载) 注意!!!
与 lazy=“true” 类似. 主要区别是增强延迟检索策略能进一步延迟 Customer 对象的 orders 集合代理实例的初始化时机:
• 当程序第一次访问 orders 属性的 iterator() 方法时, 会导致 orders 集合代理类实例的初始化
• 当程序第一次访问 order 属性的 size(), contains() 和 isEmpty() 方法时, Hibernate 不会初始化 orders 集合类的实例,
仅通过特定的 select 语句查询必要的信息, 不会检索所有的 Order 对象
10.缓存是按id来查询的! (使用id获得对象 才有效)
一级缓存 相对于类对象,
二级缓存 相对于sessionfactory,应用级别的缓存。在session查询数据库前的缓存
注意!!!
对于集合里的二级缓存,不仅要声明此时对象里的集合属性要二级缓存,而且集合里的对应类型对象也要声明是二级缓存。这样才能实现二级缓存的效果!
不然的话虽然第一次查询这个集合里的所有数据,第二次查询是集合里的对象所对应的属性还是要再按照其自身的id依次查询(生成对个sql语句),不好。
缓存一般使用在load和get方法
query.list()查询方法默认不使用缓存。就算hql语句后又where id=。。。都不行。
1.如果要使用query.list()那么要使用迭代器 iterator();不过有n+1次查询问题,不常用!!!
2.也可以使用 .setCacheable(true)// 是否使用查询缓存,需要在hibernate.cfg.xml中开启查询缓存才行(不过hql条件要一致)
1. select new list(p.name, p.address) from Person as p ;
select将选择出来的属性存入一个List对象中
select new ClassTest(p.name, p.address) from Person as p;
select将选择出来的属性封装成对象,前提是ClassTest支持p.name, p.address的构造函数,
select new map(p.name as personName) from Person as p ;
select将选中的表达式命名为别名,这种用法与new map()结合,选择出来的是Map结构,
以personName为key,将实际选择出来的值作为value