hibernate的关联

来源:互联网 发布:侯景之乱 知乎 编辑:程序博客网 时间:2024/05/20 06:37

hibernate只会根据映射文件来工作,不会因为你的pojo类来影响

一,多对一的关联

多对一是用的最多的关系,因为效率比起其他的来都要高些,在多的对象中的pojo中用对象来代替外键的id,这样可以通过多的一方找到外键对象的全部属性

在配置文件中

<many-to-one name="totalMenu" column="totalId" not-null="true"></many-to-one>

如果外键设置为空的话 ,那么外键对象不能为空,否则报错 name = 是对象的字段名字,column写外键的Id , 缺省是按照外键的id查找,但是也可以设置不是按照外键来找 property-ref="totalname"

二,一对多的关联

一对多的效率不是很高,一般都是多的一方是有限个的时候用到一对多,如果多的一方数据量很大,那么一般不使用一对多,仅使用多对一来单向的关系,在一方用个set集合来包含多的一方的子类,在映射文件中有个<set> 来配置这个,对于维护,要在多的一方来维护有利于效率的提升 在<set> 中写入 inverse = " true"

这个inverse 的意思就是说在一对多或者多对多的关系中,这个关系交给谁来维护,加入inverse=false , 默认为false, 这样的话 关系两端发生变化的时候,都会更新数据库,设置为true的话,那么就是关系交给对方管理,只有等对方删除,增加的时候,数据库才会更新

<class name="hwt.pojo.TotalMenu" table="totalMenu">

<id name="totalId">

<generator class="native"></generator>

</id>

<property name="totalName"></property>

<!-- 一对多 -->

<set name="childSet"> <!-- hibernate从提供了set来放置 -->

<key column="totalId"></key><!-- 外键,要和many-to-one里面的column样对应,意思就是说根据totalId来找到ChildMenu这个类 -->

<one-to-many class="hwt.pojo.ChildMenu"/>

</set>

</class>

三,一对一的关系关联

person  : pid ----- pname 

cardId : cid -- card  (这里的cid 就是pid里面的值一一对应的)

1person

<class name="hwt.pojo.Person" table="person">

<id name="pid">

<generator class="native"></generator>

</id>

<property name="name"/>

<one-to-one name="cardId"/> <!-- 这里缺省了是表示默认根据pid来找cardId对象 -->

</class>

2,cardId类

<class name="hwt.pojo.CardId" table="card_id">

<id name="cid">

<generator class="foreign">

<param name="property">person</param>

</generator>

</id>

<property name="card"></property>

<one-to-one name="person" constraint="true"></one-to-one>

</class>

也可以是基于many-to-one 这种模式来做one-to-one的关系映射

person : pid , panme ;

cardId : cid , card , pid ; (用一个外键)

person:

<class name="hwt.pojo.Person" table="person">

<id name="pid">

<generator class="native"></generator>

</id>

<property name="name"/>

<one-to-one name="cardId" property-ref="person"/> <!-- 这里缺省了是表示默认根据pid来找cardId对象,加了这个的话那就是去cardId里面根据person的相同来匹配 -->

</class>

cardId:

<class name="hwt.pojo.CardId" table="card_id">

<id name="cid">

<generator class="native"></generator>

</id>

<property name="card"></property>

<many-to-one name="person" column="pid" not-null="true" unique="true"></many-to-one> <!-- 这里就相当于一个多对一的关系映射,只是这里设置了唯一约束 -->

</class>

多对多的关系映射

对于多对多的关系映射,不需要建立中间表,中间表会根据关系来生成,如果要操作中间表,就操作对象的集合

teacher :

<class name="hwt.pojo.Teacher" table="teacher">

<id name="tid">

<generator class="native"></generator>

</id>

<property name="tName"></property>

<set name="stus" table="stu_teacher"><!-- 对于中间表,这里写个中间表的表名,要与stu -->

<key column="t_id"></key> <!-- 这里的key就相当于是个外键 -->

<many-to-many class="hwt.pojo.Student" column="stu_id"/><!-- column这里就相当于是中间表的字段 -->

</set>

</class>

student:

<class name="hwt.pojo.Student" table="stu">

<id name="stuId" column="stu_id">

<generator class="native"></generator>

</id>

<property name="stuName" column="stu_name"></property>

<set name="techers" table="stu_teacher" inverse="true"><!-- 对于中间表,这里写个中间表的表名 -->

<key column="stu_id"></key><!-- 这里的stu_id 就是上面的 many-to-many column-->

<many-to-many class="hwt.pojo.Teacher" column="t_id"/><!--column里面的值就是上面的key中的column的值-->

</set>

</class>

Component

如果对于一个类,(可以没有pojo类想对应)想把它加入到一张表中,可以用Component来包含

Name 类 --> private String firstName;

         private String lastName;

Person类 --><class name="Person" table="person">

<id name="pid">

<generator class="native"></generator>

</id>

<component name="name">

<property name="firstName"></property> <!--这两个字段会出现在person表中-->

<property name="lastName"></property>

</component>

</class>

对于关系映射的时候,多对一,或者一对多,或者多对多,在查主表的时候不会查找从表,只有一条sql语句,但是查从表的时候会出现两条查询语句,但是对于一对一的关系,在查主表的时候,会查找从表,但是也是只有一条sql语句

原创粉丝点击