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


恒之贵,何必三更起五更睡;最无益,只怕一日曝十日寒--港湾小唯与之共勉
时间: 2024-08-10 02:10:22

Hibernate基础知识整理(二)的相关文章

Hibernate基础知识整理(三)

继承映射 Employee(id,name,age); Skiller  extends Employee {skill}; Seller extends Employee{sell}; 一:一张表实现继承映射 create table  Employee(id int primary key,name varchar(20),age date,skill varchar(20),sell varchar(20)); 映射文件Employee.hbm.xml相关配置: <class name=&qu

java基础知识整理(二)

字符串 ①String 串连接: 提取子字符串: 从字符串中分解字符: 得到字符串长度: 测试字符串是否相等: 查找特定子串: 将基本数据类型转化为字符串类型: String y = Integer.toString(x); ②StringBuffer 有一个容量的概念,需要时查找资料 初始化字符串(append.setLength()): 取字符串的单个字符: 单个字符串赋值: 指定位置插入字符串: 返回字符串的子串: 倒置字符串的内容: 字符串扩展知识: 面试题: "a"+&quo

Kali Linux渗透基础知识整理(二)漏洞扫描

Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网络上传输的数据量. TCP协议 TCP是因特网中的传输层协议,使用三次握手协议建立连接.当主动方发出SYN连接请求后,等待对方回答SYN+ACK ,并最终对对方的 SYN 执行 ACK 确认.这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议. 连接建立 TC

DIV+CSS网页布局常用的一些基础知识整理

CSS命名规范一.文件命名规范 全局样式:global.css:框架布局:layout.css:字体样式:font.css:链接样式:link.css:打印样式:print.css: 二.常用类/ID命名规范页 眉:header内 容:content容 器:container页 脚:footer 版 权:copyright 导 航:menu主导航:mainMenu子导航:subMenu 标 志:logo标 语:banner标 题:title侧边栏:sidebar 图 标:Icon注 释:note

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback

java基础知识(二)

1.关于static关键字总结: 1.不能在static修饰的方法中引用this变量,只能引用一些静态变量或方法,或new新的对象(可以定义局部变量). 简言之,静态方法或块中,只能引用静态的方法或变量. 2.类中的成员变量(static修饰)有缺省值,而类的定义的方法中的局部变量没有缺省值. 3.在类的构造器中,可以引用任何的静态或非静态的变量和方法,可以在非static方法中调用static方法. 4.static{}块中的代码在类装载中仅执行一次. 5.在7-7,A staticmetho

Java基础知识整理(一)

概述 公司业务需要,产品既要有.NET又需要Java,没得选择,只能业余时间学习Java,整体觉得Java也.NET还是很相似的,只是语法有差别,差别也不是很大,这就将学习Java的基础知识整理下,以便于自己的学习.作为个.NET程序猿也可以学习Java ,毕竟技多不压身,学习多也要精通. 开发工具 eclipse ,开发java类似.NET 需要装JDK类似.NET Framework. Java开发工具eclipse设置 1.设置字体:window设置: 2.设置快捷键:window--ke

web基础知识(二)关于ajax,Jquery传值最基础东西

这次还是一些关于jQuery,ajax前后台传值情况, 是自己在做点小东西过程中遇到的,记录下来为自己也方便别人 列表很多,点击编辑和删除无刷新的进行操作的话,肯定是ajax了,因为无刷新嘛,可能有的朋友会说直接传值,传ID到Action删除不就OK了,用得着写js么,纯粹自己找麻烦嘛. 其实这里重点是无刷新的啦, 这个上传后到这里来,有个预览功能,把本次的全部预览,如果全部刷新的话,那么刚才上传的就不会在这个页面了,so,还是采用无刷新的比较好. 点击编辑跳到一个新的页面的时候有两种方法可以选

perl重点基础知识整理

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86