整理的Hibernate

最近空闲了很长一段时间..忘了不少了

1.Query query = session.createQuery("from Emp"); // HQL语句

2.List empList = query.list(); 在默认情况下,hibernate会把所有数据装入list

3.<generator class="assigned" /> 在idcolumn中设置主键的获取方式
identity,自动主键 都需要数据库功能的支持
sequence,序列主键
<generator class="native">
<param name="sequence">emp_seq</param>
</generator>
native,数据库会根据自己的方言自动选择一个主键生成方式

4.Iterator it = query.iterate(); 默认情况下,hibernate只会取出数据库的所有主键放入it
如果在Emp.hbm.xml进行lazy设置
<class name="domain.Emp" table="t_emp" lazy="false">
List empList = query.list();
在FALSE情况下,hibernate会把所有数据装入list
Iterator it = query.iterate(); 这里 hibernate会先查询所有的主键 装入it 然后执行第一条sql语句 让指针指向迭代器的第一个元素,即需要查询第一个元素的数据.

5.<many-to-one name="dept" class="domain.Dept" column="dept_id" />
此方式将在emp中引用到dept对象 产生多对一的效果

6.
<set name="emps" cascade="delete">
<!--delete, save-update, delete-orphan-->
<key column="dept_id" />
<one-to-many class="domain.Emp" />
</set>

这里在Dept中有emp的集合set, cascade是级联属性
delete: session.delete(session.load(Dept.class, "001"));//这样就删除了所有和Dept有关的emp
若是使用iterator.remove() 仅仅是吧Dept_id修改为null 此记录成为孤儿
7.delete-orphan:
Dept dept = (Dept) session.load(Dept.class, "002");
Set set = dept.getEmps();
Iterator it = set.iterator();
while (it.hasNext()) {
Emp emp = (Emp) it.next();
if ("director".equals(emp.getPosition())) {
it.remove();
}
}
此方法将把满足条件的孤儿删除.

8.save-update: 当向集合里add一个新的emp的时候,会向数据库中插入一条新的数据

9.组合映射
<hibernate-mapping package="domain">
<class name="User" table="user" lazy="false">
<id name="id" type="integer">
<generator class="identity" />
</id>
<property name="name" />
<component name="mailAddress" class="Address">
<property name="city" column="address_city" type="string" />
<property name="street" column="address_street" type="string" />
</component>
</class>
</hibernate-mapping>
以上xml给出了一个组合映射的例子,在程序中也许是几个对象,但是在数据库中就只有一个表
在user里有一个address的对象属性 在配置时需要component标签对hibernate进行说明

10.继承映射
hibernate能自动帮助我们对复杂关系的对象进行数据库的处理
比如Question下的两个子类EasyQuestion和ChoiceQuestion都是共享一张数据库表
id name question_type question_choice
由type来判断是某种问题,下面就是一个配置好的Question.hbm.xml文件
<hibernate-mapping package="domain">
<class name="Question" table="question" lazy="false">
<id name="id" type="integer">
<generator class="identity" />
</id>
<discriminator column="question_type" type="string" />
<property name="name" />
<subclass name="EssayQuestion" discriminator-value="e">
</subclass>
<subclass name="ChoiceQuestion" discriminator-value="c">
<property name="option" column="question_option" type="string" />
</subclass>
</class>
</hibernate-mapping>
其中我们会告诉hibernate一个分支点
<discriminator column="question_type" type="string" />
由这个的column内容来判定需要用哪个类来封装数据
在subclass中来指定判定条件和封装类
ChoiceQuestion cq = new ChoiceQuestion();
cq.setName("Java是不是微软的产品");
cq.setOption("是;不是;以上都对;以上都不对");
session.save(cq);
hibernate会根据配置文件来保存type和内容
取也是同理
使用继承映射方便了很多操作,例如
Question q1 = (Question)session.load(Question.class, 2);
Question q2 = (Question)session.load(Question.class, 3);

System.out.println(q1);
System.out.println(q2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值