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里面的值一一对应的)
1,person类
<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语句