Hibernate基础知识整理(二)

关联映射
多对一(Employee - Department)
一对多(Department - Employee)
一对一(Person - IdCard)
多对多(teachet - student)
组件映射(User - Name)
集合映射(set,list,map,bag)
inverse和cascade(Employee - Department)

 

create table Department(id int primary key,name varchar(20));

create table Employee(id int primary key ,name varchar(20),depart_id number, foreign key (depart_id) references department(id));

多对一:Employee ——>Department   

employee映射文件:

<many-to-one name="depart" column="depart_id" cascade="save-update"/>
name:对应employee类的depart字段;

column:对应在employee表中的外键列名

cascade:级联操作,emp保存dep同时保存,emp更新dep同时更新

上面这样设置代表employee表的depart_id这个列是外键对应Department表的主键

------------------------------------------------

property-ref:如果该列对应的不是外键表的主键的话,需要使用property-ref属性

一般情况下,外键对应的都是其他表的主键
如果连column都没有写,则表示外键列对应的列名就是name名

一对多:Department——>Employee
department映射文件:

<set name="employees">
<key column="depart_id" /><!-- 对应的关联列 名 -->   employee表的字段
<one-to-many class="Employee"/><!-- class表示Set中子元素的类型 -->   多的一端的类名
</set>

一对一:Person——>IdCard

一对一分为两种:基于主键的一对一和基于外键的一对一

1.基于主键的一对一

create table person(id int primary key,name varchar(20));

create table id_card(id int primary key,user_life varchar(20),foreign key (id) preferences person(id) );--id_card既是主键又是外键

IdCard.hbm.xml中对应的配置:

<class name="com.dw.domain.IdCard" table="id_card">

  <id name="id">

    <generator  class="foreign">

      <param  name="property">person</param>                    --id是从person属性里面得到的,<one-to-one>中有配置

    </generator>

  </id>

  <property name="userLife" column="user_life"/>

  <one-to-one name="person" constrained="true"/>                        --constrained="true",hibernate会自动映射外键

</class>

Person.hbm.xml相关配置:

<class name="com.dw.domain.Person" table="person">

  <id name="id">

    <generator class="native"/>

  </id>

  <property name="name"/>

  <one-to-one name="idcard">

</class>

2.基于外键的一对一

create table person(id int primary key,name varchar(20));

create table id_card(id int primary key,user_life varchar(20),person_id int ,foreign key(person_id)  references person(id));

基于外键的one-to-one
基于外键的one-to-one,可以描述为多对一,加unique="true"约束
<one-to-one name="idCard" property-ref="person"/>
<many-to-one name="person" column="person_id" unique="true" not-null="true"/>

Person.hbm.xml相关配置

<class name="com.dw.Person">

  <id name="id">

    <generator class="native"/>

  </id>

  <property name="name"/>

  <one-to-one name="idcard" property-ref="person"/>        --person是对应的IdCard的与Person对象的关联属性

</class>

IdCard.hbm.xml相关配置

<class name="com.bw.IdCard" table="id_card">

  <id name="id">

    <generator class="native"/>

  </id>

  <property name="userLife" column="user_life"/>

  <many-to-one name="person" column="person_id" unique="true"/>

</class>

一对一关联中:附表必须依赖于母表才能存在,而母表不需要依赖附属表

 查询主表对象时需注意:多对一的关系是使用两次查询得到结果,会使用懒加载。一对一关系是直接使用连接表形式得到结果

 

多对多:

create table  teacher(id int primary key,name varchar(20));

create table studeht(id int primary key,name varchar(20));

create table tea_stu(tea_id int ,stu_id int,primary key(tea_id,stu_id));

在操作和性能方面都不太理想,所以多对多的映射使用比较少,实际使用中最好转换成一对多的对象模型;hibernate会为我们创建中间关联表,转换成两个一对多;

 

Student.hbm.xml:

 

 

<class name="com.dw.Student">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="teachers" table="tea_stu">
        <key column="stu_id"/>

 

        <many-to-many class="Teacher" column="tea_id"/>

      </set>

</class>

teacher.hbm.xml:

<class name="com.dw.Teacher">

  <id name="id">

    <generator class="native"/>

  </id>

  <property name="name"/>

  <set name="students" table="tea_stu">

    <key column ="tea_id"/>

  <many-to-many class="Student" column="stu_id"/>

  </set>

</class>

一些说明:

  多对多关系的建立和前面的一对多等不同,它是向中间表插入数据而不是更新外键 

  关系的维护可以是任意一个表的对象,但不可以重复。因为student增加teachers和teacher增加students插入中间表的数据是一样的
    多对多生成的中间表的主键是多个键的联合主键 PRIMARY KEY (`student_id`,`teacher_id`),

一对多,多对一,一对一,多对多这些关联关系中,用的最多的是多对一。

组件映射(User-Name)
关联的属性是个复杂类型的持久化类,但不是实体。即:数据库表中没有表与该属性对应,但是该类的属性要永久保存的。

<component name="name" class="Name">
<property name="firstName" column="first_name"/>
<property name="lastName" column="last_name"/>
</component>

将name的属性存储到User表中去。但是在User类中属性类型是Name类型,这时候就可以使用组件关联。

Hibernate中的集合分类:

Set                          ——无序,不允许重复

List                          ——有序,可以重复

Bag                         ——无序,可以重复,hibernate特有

Map                        ——键值对

Array       ——有序

Hibernate集合选用原则:

使用hibernate,绝大多数的情况下使用的是set,set是不允许重复的。如果习惯性使用List,但是不想要保持顺序,使用bag进行映射,想保存顺序使用List映射

在Hibernate中集合都是对基础接口重新封装实现的,可以实现懒加载,属于hibernate,所以在用集合时用集合接口Set,List(Bag也用List),Map。

cascade级联:

cascade用来说明在对主对象进行操作时是否对关联的从对象执行相同的操作;

常见的cascade属性:
none(默认值,不进行任何操作)
all(所有的,对我进行什么操作,对相级联的对象做同样的操作)
save-update(保存和更新的时候做级联)
delete(删除的时候做级联)
lock()
delete-orphan(在one-to-many的时候才可以使用,指的是将一删掉就会将1下的所有多删除)
。。。。等等
需要多个级联操作可以使用逗号分隔即可。
配置在具有多个对象关联的地方,比如一对一,一对多等

拒绝维护关系:inverse属性
如果设置了inverse属性为true,则表示放弃对象关系的维护。也就是给该对象属性赋值但是它不会进行外键的更新。
 
 
一般的,在多对一的情况下,我们将一的一方设置放弃维护关联关系,将关联关系交给多来维护,这样可以省略2条update语句
inverse使用的限制:
不能在有序的集合使用。因为inverse=true放弃维护关联,所以就无法保持有序
inverse属性只会在集合属性才有。
我们知道在多对多的时候不能两方都进行关系的维护,是因为中间表的主键约束冲突。解决这个问题的方法就是在任意一端设置inverse=true,放弃对象关系的维护
注意:如果放弃了维护关系,那么级联会失效转自:http://www.cnblogs.com/aigeileshei/p/5801211.html


恒之贵,何必三更起五更睡;最无益,只怕一日曝十日寒
--港湾小唯与之共勉

转载于:https://www.cnblogs.com/xiaoweigangwan/p/7814988.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值