Hibernate学习笔记(二)
23.延迟检索和立即检索:
(1)当想要先延迟加载页面的数据时,当load返回对象时,不加载 ,那么当页面使用时session已经关闭了,解决方法:
lazy="false"或者在service层就获取所需的数据
24.投影查询:在选择查询的基础上,把查询结果封装到对象中
25.JDBC的第一个参数用1表示,而Hibernate用0表示
26.交叉连接(笛卡尔积)
("from Customer c,Orders o ")
[Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]], Orders [id=1, name=鲜花]]
27.隐式内连接就是在笛卡尔积的基础上过滤无效数据
[Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]], Orders [id=1, name=鲜花]]
(“from Customer c,Orders o where o.customer = c”)
28.迫切(显式)内连接会将子装入父中,组装成一个对象返回
Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]]
(“from Customer c inner join fetch c.orders”)
29.非迫切是将两个对象分别返回
[Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]], Orders [id=1, name=鲜花]]
(“from Customer c inner join c.orders”)
30.非迫切左外连接:一个数组,两个对象
(“from Customer c left outer join c.orders”)
[Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]], Orders [id=1, name=鲜花]]
[Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]], Orders [id=2, name=巧克力]]
[Customer [id=2, name=jerry, orders=[Orders [id=4, name=烛光], Orders [id=3, name=美酒], Orders [id=5, name=钻戒]]], Orders [id=3, name=美酒]]
[Customer [id=2, name=jerry, orders=[Orders [id=4, name=烛光], Orders [id=3, name=美酒], Orders [id=5, name=钻戒]]], Orders [id=4, name=烛光]]
[Customer [id=2, name=jerry, orders=[Orders [id=4, name=烛光], Orders [id=3, name=美酒], Orders [id=5, name=钻戒]]], Orders [id=5, name=钻戒]]
重新查询(右边为空)
[Customer [id=3, name=mike, orders=[]], null]
31.迫切左外连接(返回一个对象)
(“from Customer c left outer join fetch c.orders”)
Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]]
Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
Customer [id=3, name=mike, orders=[]]
32.右外连接:非迫切右外连接,两个对象
(“from Customer c right outer join c.orders”)
[Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]], Orders [id=1, name=鲜花]]
[Customer [id=1, name=tom, orders=[Orders [id=1, name=鲜花], Orders [id=2, name=巧克力]]], Orders [id=2, name=巧克力]]
[Customer [id=2, name=jerry, orders=[Orders [id=3, name=美酒], Orders [id=4, name=烛光], Orders [id=5, name=钻戒]]], Orders [id=3, name=美酒]]
[Customer [id=2, name=jerry, orders=[Orders [id=3, name=美酒], Orders [id=4, name=烛光], Orders [id=5, name=钻戒]]], Orders [id=4, name=烛光]]
[Customer [id=2, name=jerry, orders=[Orders [id=3, name=美酒], Orders [id=4, name=烛光], Orders [id=5, name=钻戒]]], Orders [id=5, name=钻戒]]
[null, Orders [id=6, name=灯光]]
33.右外连接:迫切右外连接,一个对象
(“from Customer c right outer join fetch c.orders”)
Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]]
Customer [id=1, name=tom, orders=[Orders [id=2, name=巧克力], Orders [id=1, name=鲜花]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
Customer [id=2, name=jerry, orders=[Orders [id=5, name=钻戒], Orders [id=4, name=烛光], Orders [id=3, name=美酒]]]
null
35.局部命名查询:要写清楚局部类的全限定名+query的名字
Query query = session.getNamedQuery(“com.javaframe.domain.Customer.bcd”);
36.全部命名查询:query的名字
Query query = session.getNamedQuery(“abc”);
34.学习ORM之前,是先建表的,学习ORM后,一般是先进行对象的创建再进行数据库的创建(实际应用则是先建表)
35.悲观锁
(1)读锁:select * from xxx lock in share mode => java:get(class,id,LockOption.READ);
(2)写锁:select * from xxx for update => java:get(class,id,LockOption.UPGRADE);
36.乐观锁
(1)实体类中加入版本控制属性(version:Integer);
(2)hbm中,加入version元素
37.log4j.properties配置文件的内容
(1)记录器(log4j.rootLogger=日志级别, 输出源1,输出源2,。。。。)
(2)输出源(log4j.appender.输出源的名称=输出源的实现类:log4j.appender.file=org.apache.log4j.FileAppender)
?常见的输出源实现类
org.apache.log4j.FileAppender 输出文件中
file ,表示文件输出位置
org.apache.log4j.ConsoleAppender 输出到控制台
Target ,表示使用哪种输出方式,在控制台打印内容,取值:System.out / System.err
(3)布局(log4j.appender.数据源.layout=org.apache.log4j.PatternLayout:log4j.appender.stdout.layout=org.apache.log4j.PatternLayout)
38.多对一配置中用unique设置为true
39.注意在使用一对一关系时只有外键所在的类对象才可以维护外键
40.存放在二级缓存的数据的要求:缓存存放在内存,数据库数据放在硬盘
(1)经常使用;
(2)不经常修改,涉及并发问题,不同进程频繁同步。适合地区数据。
41.使用二级缓存的配置工作:
(1)导包
(2)配置文件
42.缓存的构成
(1)类缓存:存储实体类
二级缓存在缓存数据时,并不是以对象的形式缓存,缓存的是对象数据的散列,每次从二级缓存拿会在一级缓存中组装成对象
(2)集合缓存
配置方式:完整类名.集合的属性名
必须配合类缓存使用
存放的是数据的id,对应的具体数据存放在类缓存区中(这就是为什么要顺便再类缓存中配置集合的这个类)
(3)查询缓存(HQL)
与集合缓存相似,也是要配合类缓存使用
要二次设置,因为数据查询过多,没有必要每条语句的结果都存进去
query.setCacheable(true);//二次设置查询缓存,要求将这条语句存进缓存
(4)时间戳缓存区
update(),createQuery(),createCriteria()等面向对象的方法时会存储最后的操作时间
记录对表操作的时间来确保二级缓存中的数据是有效的
43.timeToIdleSeconds:在缓存中不被使用就被销毁的时间
timeTiLiveSeconds:可以存活的时间,一般大于被销毁的时间
#总结:
#####以上为我学习hibernate时的笔记第二部分,有误欢迎指正。