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 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双方配置同单向

 

猜你喜欢

转载自dampce032.iteye.com/blog/1019307