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 class="native" /> </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" class="com.linys.model.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 class="native" /> </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" class="com.linys.model.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 class="foreign"> <!--关联持久化类的属性名--> <param name="property">husband</param> </generator> </id> <!--用于映射1-1关联--> <one-to-one name="husband" 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" class="Group"> <column name="groupid" not-null="true" /> </many-to-one>
一对多:
1)为One方持有的对象配置
<!-- set 指定Object类中的属性 --> <set name="users" > <!-- 指定在关联表中的外键字段 --> <key column="groupId" /> <!--set中包含的对象 --> <one-to-many class="com.linys.model.User"/> </set>
双向:
many方和one方都进行配置,不过需要注意的是在指定外键时,名字要相同
四、多对多映射
1.数据库中表的情况
如一个老师带多个学生,一个学生可以被多个老师带
在数据库中存在三张表,教师,学生,以及两者的关联表
2.单向和双向加Object类中的差别
单向:many一方持有另一方对象
双向:双方持有
3.映射表中的配置
单向:
Many一方持有的对象配置
<?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 class="native"></generator> </id> <property name="name"></property> <!-- 关联信息 --> <!-- name:该类包含的属性名 table指的是关联的表 --> <set name="students" table="t_s"> <!-- 该类在关联表中的信息 --> <!-- 关联表中的字段 --> <key column="teacher_id"/> <!-- 与该类关联的类的信息 --> <!-- 类名,以及在关联表中的关联字段 --> <many-to-many class="com.linys.model.Student" column="student_id"/> </set> </class> </hibernate-mapping>
双向:
1)many双方配置同单向