`
wh8766
  • 浏览: 34883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

整理的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);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics