Hibernate初学小笔记2《2017-09-07》
来源:互联网 发布:android c 高级编程 编辑:程序博客网 时间:2024/06/05 08:21
一、一些注意事项
特别注意:在映射时,要将类的全限定名加上,一个commit一个session
<hibernate-mapping><!--package="com.how2java.pojo"--> <class name="com.how2java.pojo.Product" table="product_"> //这里的class name <id name="id" column="id"> <generator class="native"> </generator> </id> <property name="name" /> <property name="price" /> <many-to-one name="category" class="com.how2java.pojo.Category" column="cid" /> //多对一映射,一个或多个Product对应一个Category </class></hibernate-mapping>
二、一对多映射
一对多映射:
<set name="products" lazy="false"> <key column="cid" not-null="false" /> <one-to-many class="Product" /></set>
set 用于设置一对多(多对多也是他)关系,也可以用list,设置稍复杂点,这里使用简单的set来入门。
name=”products” 对应 Category类中的products属性
lazy=”false” 表示不使用延迟加载。 <key column = "cid" not-null="false"/>
表示外键是cid,可以为空 <one-to-many class="Product" />
表示一对多所对应的类是Product
三、多对多映射
多对多映射:
User.hbm.xml
<set name="products" table="user_product" lazy="false"> <key column="uid" /> <many-to-many column="pid" class="Product" /></set>
Product.hbm.xml
<set name="users" table="user_product" lazy="false"> <key column="pid" /> <many-to-many column="uid" class="User" /></set>
四、Q&A
Q:为什么要用关系延迟加载?
A:比如有的页面只需要显示分类信息,这个时候倘若没有开启延迟加载,那么就会把分类下的产品也查询出来了,增加了不必要的开销
五、级联
四种级联:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
delete:删除时执行级联操作;
save-update:保存和更新时执行级联操作;
级联通常用在one-many和many-to-many上,几乎不用在many-one上。
六、分页查询
分页查询:
Criteria c= s.createCriteria(Product.class);c.add(Restrictions.like("name", "%"+name+"%"));c.setFirstResult(0); //从0开始,第i个数据c.setMaxResults(5); //表示一共查询j条数据//同名数据(不同主键)亦会被查询出来
七、关于延迟加载
load方式是延迟加载,只有属性被访问的时候才会调用sql语句
get方式是非延迟加载,无论后面的代码是否会访问到属性,马上执行sql语句
System.out.println("log1"); Product p = (Product) s.get(Product.class, 1); System.out.println("log2"); Product p2 = (Product) s.load(Product.class, 2); System.out.println("log3"); System.out.println(p2.getName()); System.out.println("log4");
八、session获取方式
Hibernate有两种方式获得session,分别是: openSession和getCurrentSession
他们的区别在于
获取的是否是同一个session对象。
openSession每次都会得到一个新的Session对象。
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象事务提交的必要性
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的。
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
九、N+1
hibernate提供Query的查询方式。假设数据库中有100条记录,其中有30条记录在缓存中,但是使用Query的的list方法,就会所有的100条数据都从数据库中查询,而无视这30条缓存中的记录
N+1是什么意思呢,首先执行一条sql语句,去查询这100条记录,但是,只返回这100条记录的ID
然后再根据id,进行进一步查询。
如果id在缓存中,就从缓存中获取product对象了,否则再从数据库中获取
1.通过Query的iterator把所有满足条件的Product的id查出来
2.然后再通过it.next()查询每一个对象,如果这个对象在缓存中,就直接从缓存中取了,否则就从数据库中获取
十、乐观锁
乐观锁:增加一个version字段,用于版本信息控制。这就是乐观锁的核心机制。
比如session1获取product1的时候,version=1。 那么session1更新product1的时候,就需要确保version还是1才可以进行更新,并且更新结束后,把version改为2。
注意: version元素必须紧跟着id后面,否则会出错。
<version name="version" column="ver" type="int"></version>
原理:
1. 假设数据库中产品的价格是10000,version是10
session1,session2分别获取了该对象
都修改了对象的价格
session1试图保存到数据库,检测version依旧=10,成功保存,并把version修改为11
session2试图保存到数据库,检测version=11,说明该数据已经被其他人动过了。 保存失败,抛出异常
参考来源:
http://how2j.cn/k/hibernate/hibernate-transaction/43.html
十一、常见注解一览
http://how2j.cn/k/hibernate/hibernate-annotation-manual/1051.html
- Hibernate初学小笔记2《2017-09-07》
- Hibernate初学小笔记1《2017-09-06》
- hibernate初学笔记3《2017-09-09》
- Struts初学小笔记2《2017-09-19》
- Struts初学小笔记1《2017-09-08》
- Spring初学小笔记1《2017-09-08》
- 初学hibernate笔记
- 初学hibernate笔记
- Hibernate框架初学笔记
- opencl初学笔记--经典初学小案例
- hibernate之初学篇笔记
- 初学java的小笔记
- 初学Hibernate(2)
- hibernate 的小笔记
- 小白的docker初学笔记
- Git初学 小白笔记(一)
- Git初学 小白笔记(二)
- hibernate初学总结(2)
- maven项目编译报错
- Visual Studio工具箱显示自定义控件
- VS2013 编辑文件的编码格式设置 以及在工程属性设置中的关系
- HTTP 缓存
- Python学习笔记 8--文件的管理、模块与包
- Hibernate初学小笔记2《2017-09-07》
- Android开发之资源目录assets与res/raw的区别分析
- 单例模式..需要注意
- python: 递归记录 指定后缀名 的文件
- 解决vue安装教程(自己安装过程及遇到的一些坑)
- 169.Majority Element
- java导出Excel文件
- 数据挖掘之关联分析二(频繁项集的产生)
- 总结下最近面试iOS的一些情况