Hibernate各种映射的小结
Hibernate各种映射的小结
个人定义:
1.many方:持有foreign key 字段的一方
2.单向:关联双方在Object表现形式时,持有另一方的情况,一般Many方持有另一方的对象
? ?双向:关联双方相互持有对方对象
3.many-to-one: 对应于数据库表格中的foreign key
一、一对一外键映射
1.数据库中表的情况
一个表的外键关联另一个表的主键
2.映射表中的配置
单向:
Many方持有的对象配置many-to-one,设定unique="true"
如?
?
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.linys.model.Husband" table="husband"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator /> </id> <property name="name" type="java.lang.String"> <column name="name" length="50" not-null="true" /> </property> <!-- 关联信息 --> <!-- name: 该Object类(Husband)关联的对象属性 class:关联的对象的类 unique:值为true时表一对一外键关联 column:在关联表中关联字段 --> <many-to-one name="wife" unique="true"> <column name="wifeid" /> </many-to-one> </class></hibernate-mapping>?
?
双向:
1)Many方持有的对象配置同单向
2)为One方持有的对象配置one-to-one,指定cascade=true,inverse=true
如?
?
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping> <class name="com.linys.model.Wife" table="wife"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator /> </id> <property name="name" type="java.lang.String"> <column name="name" length="50" not-null="true" /> </property> <!-- 关联信息 --> <!-- name: 在Wife中关联的对象名 class: 关联的对象类 property-ref :在关联的对象类中该类的关联属性名 cascade:设置是否级联 --> <one-to-one name="husband" property-ref="wife" cascade="all" inverse="true"/> </class></hibernate-mapping>?
?
3.对象存储的操作
同时存储两个对象时,顺序不一样,插入语句不一样,但多不会报错
存一个对象时,如果是单向时,如果存many方会出错,因为many方有外键,如果是one方,不会出错,但只会存one对象;如果是双向时,如果存many方会出错,因为many方有外键,如果是one方,不会出错,会存储双方,因为one方是cascade方,主控方
?
二、一对一主键映射
1.数据库中表的情况
一个表的主键依赖与另一个表的主键生成,即一个表的主键又是外键关联到另一个表的主键
2.映射表中的配置
单向:
Many方1)配置id:生成器generator为foreign,并指定Object类的关联属性
2)配置one-to-one 配置关联属性,必须加constrained为true
如:
?
<id name="id" type="java.lang.Integer" column="id"> <!-- 基于主键关联时,主键生成策略是foreign,表明根据关联类生成主键 --> <generator constrained="true"/>?
双向:
1)Many方同单向
?
2)为One方持有的对象配置one-to-one,指定cascade
<one-to-one name="wife" property-ref="husband" cascade="all"/>
3.对象存储的操作
同时存储两个对象时,顺序不一样,插入语句不一样,但多不会报错
存一个对象时,如果是单向时,如果存many方会插入双方,因为many方有外键,需先插入one方获得主键后才能插入,如果是one方,不会出错,但只会存one对象;如果是双向时,如果存many方或one方,都不会出错,会存储双方,因为one方是cascade方,是主控方
?
?
三、多对一和一对多,以及二者一起用时构成双向
1.数据库中表的情况
一张表的外键关联另一张表的主键
2.Object类中的差别
多对一,many方持有one方的对象
一对多,one方持有many方的Set对象集合
3.映射表中的配置
多对一:
Many方1)配置many-to-one 配置关联属性
如:
<many-to-one name="group" not-null="true" /> </many-to-one>
?一对多:
?
1)为One方持有的对象配置?
?
<!-- set 指定Object类中的属性 --> <set name="users" > <!-- 指定在关联表中的外键字段 --> <key column="groupId" /> <!--set中包含的对象 --> <one-to-many name="code"><?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.linys.model.Teacher"><id name="id"><generator table="t_s"> <!-- 该类在关联表中的信息 --> <!-- 关联表中的字段 --><key column="teacher_id"/><!-- 与该类关联的类的信息 --><!-- 类名,以及在关联表中的关联字段 --><many-to-many column="student_id"/></set> </class></hibernate-mapping>?
?
双向:
1)many双方配置同单向
?