一、Hibernate
1、级联操作
例子:
代码语言:javascript复制<set name="children" cascade="delete">
<key column="parentId"></key>
<one-to-many class="Department"></one-to-many>
</set>
这样在添加(cascade="delete"),在进行删除操作时,会对“children”进行相同的操作。
代码语言:javascript复制 cascade属性有四种取值:
all:所有操作都执行级联操作;
none:所有操作都不执行级联操作;
save-update:保存和更新时执行级联操作;
delete:删除时执行级联操作;
2、
代码语言:javascript复制@Resource //Spring 注入,获取实例
private SessionFactory sessionFactory;
sessionFactory.getCurrentSession().createQuery(//
"FROM Department d WHERE d.parent IS null"//面向对象查询
).list();
1)返回单条记录:get()、load()方法
区别:a、get()方法不采用延迟加载方式;load()方法采用延迟加载的方式
b、使用get()方法查找不存在的记录时会报NullPoint异常;
使用load()方法查找不存在的记录时会报ObjectNotFound异常
疑问:为什么get()方法查找不存在的记录时会报空指针异常?
回答:get()方法执行查询语句,当查找到不存在的记录时就返回空值,当调用对象属性的
get()方法时,由于属性值为空,因此才会报空指针异常
2)返回多条记录:list()方法、iterator()方法
区别:1)list()方法不采用延迟加载方式;iterator()方法采用延迟加载的方式
2)list()方法在执行时有N条记录就执行N条SQL语句;
iterator()方法在执行时会产生"N 1"问题:有N条记录,就会执行N 1条SQL语句。
疑问:为什么iterator()方法在执行时会产生"N 1"问题?
回答:iterator()方法在执行时,首先会查询满足条件的记录的主键列,然后通过主键列再去
执行N条SQL语句