一对一
********************************************************
A、主健映射:
都是one-to-one
要用foreign生成策略。
以汽车car和发动机Engine(一对一关系)为例:
a、主表Car.hbm.xml的写法
<class name="Car" table="car_pk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<property name="name" column="name" type="string" />
<one-to-one name="engine" class="Engine" cascade="all"/>
</class>
注:cascade="all" 表示增删改查Car对象时都会级联增加、删除和修
改Engine对象。
b、辅表Engine.hbm.xml的写法
<class name="Engine" table="engine_pk">
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">car</param>
</generator>
</id>
<property name="model" column="model" type="string" />
<one-to-one name="car" class="Car" constrained="true"/>
</class>
User类Address类
User为主类,Address为子类
两个类中所有的属性都要加上geter,setter方法
在User类中的setter中应该这样写是两个表关联起来:
public void setAddress(Address address) {
this.address = address;
address.setUser(this);
}
注:constrained="true"表示Engine应用了Car的主健作为外健
注意属性类型,不同的数据库属性所对应的数据类型不一样,Mysql 没有Long型,应该用Integer
B、唯一外健映射:
主表中用one-to-one,通过property-ref many-to-one
在主表中(User)
<one-to-one name="address" class="Address" cascade="save-update"></one-to-one>
在附表中(Address)
<many-to-one name="user" class="User" unique="true" column="age"></many-to-one>
********************************************************
一对多
********************************************************
编写User.hbm.xml,关联属性acts的配置如下:
<set name="acts" cascade="all"//<set name="acts">表示属性acts是一个Set集合
inverse="true">//inverse="true"表示由关系的另外一端
<key column="fid"/>//<key column="fid">表示关系另一端(多端,如Account表)的关联表中和本表相关的外键字段的名字是fid
<one-to-many class="Account"/>//表示该集合中保存的是持久对象,因此该集合属性acts(HashSet的名字)是一个代表一对多关系的"关联属性"
</set>
其中:
** <set name="acts">表示属性acts是一个Set集合
** <one-to-many>表示该集合中保存的是持久对象,因此该
集合属性acts是一个代表一对多关系的"关联属性"
** class="Account"表示该集合中保存的持久对象的类型是Account
** <key column="fid">表示关系另一端(多端)
的关联表中和本表相关的外键字段的名字是fid
** cascade="all"是级联操作的级别
** inverse="true"表示由关系的另外一端
(多端)来维护关系,以提高效率
注:在one一端的Set集合应该是HashSet集合
Set<Account> accs=new HashSet();
在many端映射正常些
<many-to-one name="user" column="accfid" cascade="save-update"></many-to-one>
name="user":是对应User类型这个属性的名字
column="accfid":many端外键的名字,与one端 <set 中的 <key 中的column的值一致
one端的setter和getter方法不要少,另外再加上addXXX()方法。
********************************************************
多对多
********************************************************
在student.hbm.xml中的XML的编写:












在course.hbm.xml中的XML的编写:




