关于
最近在采用SSH做一个简单的ERP系统时遇到关于关系映射配置的问题,由于以前学习时与数据库的操作都使用SQL语句,所以这里查了一些这方面资料,这里就写一些个人的理解。
首先以一个模块了解一下一对多,多对一。这里抽取出一个基础参数模块,我们应该知道像’政治面貌’这个基础参数对应有 团员,党员等不止一个值,显然这里使用一张表是不合理的
这里两张表,相应的项目中就有两个子模块,对应两个配置文件,首先看多的一方(值表)对应的配置
多对一配置
<hibernate-mapping>
<class name="cn.hhxy.gjxy.basedataval.vo.BaseValModel" table="tbl_param">
<id name="uuid">
<generator class="native" />
</id>
<property name="paramName"/>
<many-to-one name="baseModel" column="paramTypeId" class="cn.hhxy.gjxy.basedata.vo.BaseModel"></many-to-one>
</class>
</hibernate-mapping>
这是一个基础参数值表对应的配置文件,应为该方为多的一方,也就是存在一个外键paramTypeId对应paramType表的uuid,关于这里需要注意的是这里是用一个基础参数类型的一个对象来作为成员对象存储的,所以对应关系为name=”baseModel” column=”paramTyped”
name对应类外键字段(多的一方保存一的一方的一个对象做数据成员)
column对应多的一方的数据库表外键字段
class一的一方的模型类
这里配置多对一的关联关系的话,Hibernte在对数据操作的时候就会
知道”你的上司是谁”(本例的基础参数值对应的基础参数类型)
一对多配置
<hibernate-mapping>
<class name="cn.hhxy.gjxy.basedata.vo.BaseModel" table="tbl_paramtype">
<id name="uuid">
<generator class="native" />
</id>
<property name="paramTypeName"/>
<set name="baseVal" cascade="all" inverse="true">
<key column="paramTypeId"></key>
<one-to-many class="cn.hhxy.gjxy.basedataval.vo.BaseValModel"/>
</set>
</class>
</hibernate-mapping>
这里一对多的配置关系到一个set集合,这里的思想是:对数据操作时Hibernate怎么知道你有没有”下级”,存放在哪里。我们知道数据库中不可能也不会为你存放”下级”的字段,就像你要知道你的老板是谁,而你的老板却不需要知道你是谁。那这里就需要专门在项目中设置一个存储”下级”信息的集合set
基础参数类型Model
在一(老板)方的Model类设置set集合,用于存储查询到的多(员工)方的信息
这里需要注意的是:
<set name=**"baseVal"** cascade="all" inverse="true">
这里的name要与Model类中的set集合对象名相同,cascade为执行哪些集联,这里为全部(增删改查)。
inverse作用就是指定由哪一方来维护之间的关联关系。当一方中指定了“inverse=false”(默认),那么那一方就有责任负责之间的关联关系。
这里一般在双向关联中在一的一方设置为true,多的一方默认为false,由多的一方维护关联关系。
这里个人的理解为:单从数据库表来看,一的一方并不认识多的一方,而多的一方却有一的一方外键,而抽象的Model类中的set集合并不是一开始就是加载有数据的,所以每次在一的一方执行操作时,为类保持集联状态都要执行一遍更新操作,消耗资源还容易出错。所以就在多的一方维护。
<key column="paramTypeId"></key>
<many-to-one name="baseModel" column="paramTypeId" class="cn.hhxy.gjxy.basedata.vo.BaseModel"></many-to-one>
column为本类对应数据库的外键字段(数据库字段,与多对一的column保持一致)
class为多的一方对应的类(存在外键的类)
<one-to-many class="cn.hhxy.gjxy.basedataval.vo.BaseValModel"/>
到这里双向关联已经配置完毕!这里可以单项关联,但有一对多或多对一就一定有相反面,建议还是双向都关联。
注:本文为个人项目中对一对多,多对一关系配置的一些见解,希望能帮到一些人,转载请注明出处,谢谢!