Hibernate映射总结

1.多对一映射

对象模型:

 

UserGroup

id:int

name:String

group:Group

id:int

  name:String 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user"> 
   <id name="id" column="id"> 
    <generator class="identity"/> 
   </id> 
   <property name="name" column="User_name" unique="true"/> 
   <many-to-one name="group" column="groupid"/> 
  </class> 
</hibernate-mapping>

 

2.1、一对一主键关联映射(单向Person-->IdCard)

对象模型:

 

PersonIdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">idCard</param> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <one-to-one name="idCard" constrained="true"/> 
  </class> 
</hibernate-mapping>

  注意

 

 

  <!-- one-to-one标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
  constrained="true", 表明当前主键上存在一个约束,person的主键作为外键参照了idCard 
  -->

一对一主键关联映射中,默认了Cascade属性。只有在<one-to-one>标签中才会默认。

  一对一是从Person这个角度看的,看到这个人知道它的身份证号。主键关联,Person中的主键是个外键,参照IdCard的主键生成,怎样让生成的主键一样。

  一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建。

 

2.2一对一主键关联映射:(双向关联Person<---->IdCard)

 

对象模型:

 

 

PersonIdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

person:Person

 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">idCard</param> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <one-to-one name="idCard" constrained="true"/> 
  </class> 

  <class name="IdCard" table="t_card"> 
   <id name="id"> 
    <generator class="foreign"> 
    <param name="property">person</param> 
    </generator> 
   </id> 
   <property name="cardNo" column="CardNo" /> 
   <one-to-one name="person" constrained="true"/> 
  </class> 
</hibernate-mapping>

 

2.3 一对一外键关联映射(单向)

对象模型:

PersonIdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="identity"> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <many-to-one name="idCard" unique="true"></many-to-one> 
  </class> 
</hibernate-mapping>

注意:此处比普通的多对一关系多了一个unique="true"表示唯一外键关联,也可实现一对一的映射关系。

2.4 一对一外键关联映射(双向)

对象模型:

 

PersonIdCard

id:int

name:String

idCard:IdCard

id:int

  cardNo:int

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 

  <class name="Person" table="t_person"> 
   <id name="id"> 
    <generator class="identity"> 
    </generator> 
   </id> 
   <property name="name" column="Person_name" /> 
   <many-to-one name="idCard" unique="true"></many-to-one> 
  </class> 


  <class name="IdCard" table="t_idcard"> 
   <id name="id" column="id"> 
    <generator class="identity"/> 
   </id> 
   <property name="cardNo" column="cardno" /> 
   <one-to-one name="person" property-ref="idCard"></one-to-one> 
  </class> 

</hibernate-mapping>

 

注意:

<one-to-one>默认是与主键比较,Property-ref=”idCard”会指定与哪一个字段比较.

加入<one-to-one>标签和数据库没有关系,是告诉Hibernate怎么来做这件事,所以数据库不用重新导出,不像<many-to-one>因为. <many-to-one>要在表里加字段

注: 

 

<one-to-one>标签 含义:指示如何加载关联对象,或者引用对象,默认根据主键加载,

<many-to-one>标签含义:加入外键在多的一端,指向一的一端

 

3.1.一对多关联(单向)

模型文件:

ClassesStudent

id:int

name:String

student:Set

id:int

  name:String

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Class" table="t_class"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="student" inverse="false" cascade="all">          <key column="classid" /> 
   <one-to-many class="Student"/> 
   </set> 
  </class> 
</hibernate-mapping>

 在该配置文件中,inverse可以使用默认false,或者显示指定false,如以上代码。这样就指定一对多之间的关系由Class这个POJO来维护。在单项一对多关联中,这一点很重要,下面我们通过测试来说明。cascade="all"指定级联的之间的等级,它具有如下几种值:

all : 所有情况下均进行关联操作。 
none:所有情况下均不进行关联操作。这是默认值。 
save-update:在执行save/update/saveOrUpdate时进行关联操作。 
delete:在执行delete时进行关联操作。

缺点:若将Student的classid设置为非空,将无法保存。因为不是student这一端维护关系,所以student不知道是哪个班级.

改进 采用 一对多双向关联

<set name="student" inverse="true">

这样的好处是 存入数据让多的一端进行维护,不需要发出多余的update.<!-- 分页 -->

 

3.2.一对多关联(双向)

模型文件:

ClassesStudent

id:int

name:String

student:Set

id:int

  name:String

映射关系:

<hibernate-mapping >
  <class name="Class" table="t_class"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
    <set name="student" inverse="false" cascade="all">           <key column="classid" /> 
    <one-to-many class="Student"/> 
    </set> 
  </class>

 

  <class name="com.jonsion.hibernate.Student" table="t_student">
    <id name="id">
      <generator class="native"/>
    </id>
    <property name="name"/>
     <many-to-one name="classes" column="classid"/>
    </class>
</hibernate-mapping>

 

 

4.1多对多映射(单向)

对象模型:

Role User

id:int

name:String

 

id:int

  name:String

role:Set

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="role" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="Role" column="roleid" /> 
   </set> 
  </class> 
</hibernate-mapping>

这样,hibernate会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键

 

4.2多对多映射(双向)

对象模型:

Role User

id:int

name:String

 user:Set

id:int

  name:String

role:Set

 

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 

    <class name="User" table="t_user"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="role" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="Role" column="roleid" /> 
   </set> 
  </class>
  <class name="Role" table="t_role"> 
   <id name="id"> 
    <generator class="native"/> 
   </id> 
   <property name="name" /> 
   <set name="user" table="t_user_role"> 
   <key column="userid"></key> 
   <many-to-many class="User" column="userid" /> 
   </set> 

  </class> 
</hibernate-mapping> 

 

注意:

上面中间表名字是一样的

这样,hibernate也会自动产生中间表t_user_role(userid,roleid) 并且是复合主键,userid为t_user的外键,roleid为t_role的外键

 

 

5.1第一继承映射

Animal 
private int id
private String name
private Boolean sex
--------------------------------------------------
public class Bird extends Animal 
private int height
--------------------------------------------------
public class Pig extends Animal
private int weight

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <discriminator column="type" type="string"></discriminator> 
   <property name="name"/> 
   <property name="sex"/> 
   <subclass name="Pig" discriminator-value="P"> 
    <property name="weight"/> 
   </subclass> 
   <subclass name="Bird" discriminator-value="B"> 
    <property name="height"/> 
   </subclass> 
  </class> 
</hibernate-mapping>

5.2第二继承映射

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <property name="sex"/> 
    <joined-subclass name="Pig" table="t_pig"> 
     <key column="pid"/> 
     <property name="weight"/> 
    </joined-subclass> 
    <joined-subclass name="Bird" table="t_bird"> 
     <key column="bid"/> 
     <property name="height"/> 
    </joined-subclass> 

</class> 
</hibernate-mapping>

5.2第三继承映射

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="Animal" table="t_animal" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <property name="sex"/> 
   <union-subclass name="Pig" table="t_pig"> 
   <property name="weight"/> 
   </union-subclass> 
   <union-subclass name="Bird" table="t_bird"> 
   <property name="height"/> 
   </union-subclass> 
</class> 
</hibernate-mapping>

6.Component 映射

component不是实体,没有OID

对象模型

public class Employee 
private int id
private String name
private Contact contact
-------------------------------------
public class Contact  
private String email
private String address
private String zipcode
private String contactTel
-------------------------------------
public class User  
private int id
private String name
private Contact contact

映射关系:

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="User" table="t_user" > 
   <id name="id" > 
    <generator class="native"/> 
   </id> 
   <property name="name"/> 
   <component name="contact"> 
   <property name="email"></property> 
   <property name="address"></property> 
   <property name="zipcode"></property> 
   <property name="contactTel"></property>
 

   </component> 

  </class> 
 </hibernate-mapping>

 

7 复合主键mapping

通常将复合主键相关属性,单独放到一个类中

这个类必须实现 Serializable接口

这个类必须重写hashCode()和equals()方法

<hibernate-mapping package="com.nintenyun.hibernate"> 
  <class name="SC" table="t_sc" > 
   <composite-id name="scpk"> 
   <key-property name="sno"/> 
   <key-property name="cno"/> 
   </composite-id>
  
   <property name="sname"></property> 
   <property name="cname"></property> 
  </class> 
</hibernate-mapping>

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值