Hibernate 关联映射

 

Hibernate 关联映射

多对一

一对多

一对一

多对一(Employee - Department)

映射文件<many-to-one name=”depart” column=”depart_id”/>

 

 

 

 

 

 

 

 

 


比较两图可以看到,单向多对一关联中对象模型的类之间的引用在关系模型中表示为表之间的外检引用。单向多对一,关联在对象模型和关系模型中的表现形式能够很好地匹配上。

针对以上对象模型创建出以下两个持久化类。

1)Department类

/**部门实体类*/

public class Department{

       private long id;//对象标示符(OID)

       private String name;//姓名

       public Department(){}//无参数的构造方法

       //以下为所有属性的getter和setter方法…..

 

}

2)Employee类

/**员工实体类*/

public class Emoloyee{

       private long id;//对象标示符

       private String username;//姓名

       private Department dept;//所属部门

       public Emoloyee(){}//无参数构造方法

//以下省略所有属性的getter和setter方法….

}

在这个持久化类中定义一个Department类型的dept属性,用于表示这个员工所属的部门。它们对应的映射文件如下:

Department.hbm.xml

<?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>

<hibernate-mapping>

<!—映射持久化类--!>

<class name=”com.qiujy.domain.Department” table=”department”>

<!—映射对象标示符--!>

<id name=”id” column=”id” type=”long”><generation class=”nativ” /></id>

<!—映射普通属性--!>

<property name=”name”/>

<property name=”department”/>

</class>

</hibernate-mapping>

Employee.hbm.xml

<?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”>

<hibernate-mapping>

       <!—映射持久化类--!>

       <class name=”com.qiujy.domain.Employee” table=”employee”>

       <!—映射对象标示符--!>

       <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       <!—映射普通属性--!>

       <property name=”username” not-null=”true”/>

       <!—用many-to-one元素映射多对一关联

              name属性:指定关联的属性名

              column属性:指定此关联属性在数据库表中的外键字段名

       -->

       <many-to-one name=”dept” colum=”dept_id”/>

</class>

</hibernate-mapping>

在这个映射文件中,使用many-to-one元素来映射多对一关联关系。

一对多(Department-Employee)

<set name=”employees”>

              <key column=”depart_id”/>

              <one-to-many class=”Employee”/>

</set>

1)Order类

/**订单实体类*/

public class Order{

       private long id;//对象标示符(OID)

       private String orderNo;//订单编号

       private Date loginTime;//下单时间

       public Ordert(){}//无参数的构造方法

       //以下为所有属性的getter和setter方法…..

 

}

2)Acount类

/**账号实体类*/

public class Emoloyee{

       private long id;//对象标示符

       private String loginName;//姓名

       private Set<Order> orderSer;//所有订单的集合

       public Acount(){}//无参数构造方法

//以下省略所有属性的getter和setter方法….

}

在这个持久化类中定义一个Department类型的dept属性,用于表示这个员工所属的部门。它们对应的映射文件如下:

Order.hbm.xml

<?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>

<hibernate-mapping>

<!—映射持久化类--!>

<class name=”com.qiujy.domain.Order” table=”order”>

<!—映射对象标示符--!>

<id name=”id” column=”id” type=”long”><generation class=”nativ” /></id>

<!—映射普通属性--!>

<property name=”nameNo” column=”order_no”/>

<property name=”createTime” column=”create_time” type=”timetamp”/>

</class>

</hibernate-mapping>

Acoumt.hbm.xml

<?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”>

<hibernate-mapping>

       <!—映射持久化类--!>

       <class name=”com.qiujy.domain.Acount” table=”acount”>

       <!—映射对象标示符--!>

       <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       <!—映射普通属性--!>

       <property name=”loginName” colum=”login_name”/>

       <!—映射集合属性,关联到多端的实体类à

       <set name=”orderSet” cascade=”save-update”>

              <!--用key元素指定关联到外键列-->

              <key 用one-to-many元素关联到多端的实体类>

       <one-to-many class=”com.qiujy.domain.Order”/>

       </set>

</class>

</hibernate-mapping>

 

一对一(Person - IdCard)

1)基于主键的one-to-one(person的映射文件)

<id name=”id”>

       <generator class=”foreign”><param name=”property”>idCard</param></generator>

<id>

<one-to-one name=”idCard” constrained=”true”/>

 

 

 

 


一对一(Person - IdCard)

2)基于外健的one-to-one,可以描述为多对一,加unique=“true”约束

<one-to-one name=”idCard” property-ref=“person”/>

             property-ref用于指定关联类的一个属性,这个属性将会和本外键相对应

<many-to-one name=”person” column=”person_id” unique=”true” not-null=”true”/>

 <!-唯一的多对一,其实就便成了一对一了-->

 

 

 

 

 

 

 

 


Person类

/**公民实体类*/

public class Person{

       private int id ;//对象标示符

       private String name;//姓名

       private int age;//年龄

       public Person(){}//无参构造方法

//以下为所有属性的gerrer和setter方法……..

 

}

/**身份证实体类*/

public class IdCard{

       private int id ;//对象标示符

       private intt useful-life;//有效期

       private int person_id;//公民的标示符

       public Person(){}//无参构造方法

//以下为所有属性的gerrer和setter方法……..

 

}

在这个持久化类中定义一个Department类型的dept属性,用于表示这个员工所属的部门。它们对应的映射文件如下:

IdCard.hbm.xml

<?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>

<hibernate-mapping>

<!—映射持久化类--!>

<class name=”com.qiujy.domain.IDCard” table=”idcard”>

<!—映射对象标示符--!>

<id name=”id” column=”id” type=”long”><generation class=”nativ” /></id>

<!—映射普通属性--!>

<property name=”no” not-null=”ture”/>

</class>

</hibernate-mapping>

这个映射文件没有任何特别之处,因为它并不知道Person的存在。

Peson.hbm.xml

<?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”>

<hibernate-mapping>

       <!—映射持久化类--!>

       <class name=”com.qiujy.domain.Person” table=”person”>

       <!—映射对象标示符--!>

       <id name=”id” column=”id” type=”long”><generator class=”native”/></id>

       <!—映射普通属性--!>

       <property name=”name” />

       <!—用many-to-one元素映射多对一关联

              name属性:指定关联的属性名

              column属性:指定此关联属性在数据库表中的外键字段名

              unique属性:指定值为”true”来限制多段的多重性为一

              cascade属性:用来指定两个对象之间的操作联动关系

       -->

       <many-to-one name=”dept” name=”idCard” colum=”idcard_id”

unique=”ture”

cascade=”all”/>

</class>

</hibernate-mapping>

在Person端用many-to-one来映射它的idCard属性,同时添加unique=true来表示这个是唯一的多对一,也就是一对一关联。

在这个映射中,使用一个很重要的属性cascade。这个属性用在many-to-one、one-to-one、many-to-many这些元素上,用来指定两个对象之间的操作联动关系。即当主控方(增、删和改)时,关联对象(被动方)是否同一步执行同一 操作。

这个属性有以下几种取值:

none:所有情况下均不进行级联操作。这是默认值。

all:所有情况下均进行级联操作。

save-update:在执行保存和更新时进行级联操作。

delet:在进行删除时进行级联操作。

例如:在本例中,cascade的值为all表示对Peson对象进行操作时,也会关联到对应的IDCard对象的操作。

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值