映射复合主键
当数据表中的主键是由多个字段组成就需要映射复合主键了。eg:keys表的主键是由key1和key2两个字段组成的复合主键。hibernate框架提供了<composite-id>标签,专门映射复合主键。<composite-id>有两个属性:name属性和class属性。其中name属性表示实体Bean中和复合主键对应的属性,class属性表示复合主键对应的Bean类。
也就是要将复合主键所涉及的字段单独封装在一个JavaBean中。这个JavaBean并不是一个实体的Bean。但这个封装复合主键字段的JavaBean必须实现java.io.Serializable接口。eg:对于keys表,可以建立如下复合主键类:
public class PrimaryKey implements java.io.Serializable
{
private int key1;
private int key2;
.....
}
在<composite-id>标签中需要使用<key-property>子标签来映射复合主键中的每一个字段,下面的配置对keys表和Keys类进行了映射。如下:
<hibernate-mapping>
<class name="edu.xaut.jzd.Keys" table="keys">
//映射复合主键
<composite-id name="primarykey" class="edu.xaut.jzd.PrimaryKey">
<key-property name="key1" column="key1"/>
<key-property name="key2" column="key2"/>
</composite-id>
<property name="xxx" column="xxx"/>
</hibernate-mapping>
组件映射
如果有多个实体的某些属性都相同,那么可以把这些属性组合起来,放到一个单独的JavaBean中。如firstName和lastName。这两个属性可以放到Name类中。eg:
public class Name
{
private String first;
private String last;
...
}
如果有两个类Teacher类和Student类,这两个类中都有firstName和lastName属性,就可以使用Name类来封装这两个属性。
public class Teacher
{
private Name name;
private int courseId;
...
}
public class Student
{
private Name name;
private int age;
....
}
Teacher类和Student类中的name属性被称为“组件属性”。Name类被称为组件类。其映射文件则需要使用<component>标签。eg:
<component name="name" calss="edu.xaut.jzd.Name">
<property name="first" column="first"/>
<property name="last" column="last"/>
</component>
多对一(many-to-one)单向关联关系
以客户(t_customers)和订单(t_orders)关系为例。一个订单只能属于一个客户,但是一个客户可以对应多个订单。因此,t_orders相对于t_customers来说就是多对一的关系。要想在映射文件中映射多对一的关系,需要使用<many-to-one>标签。eg:
t_orders表属性:id(主键),customer_id,order_number。
t_customers表属性:id,name。
Customer类属性:id,name; Order类属性:id,number,customer(Customer类型)。
Order类的配置如下:
<property name="xxx" class="xxxx"/>
<many-to-one name="customer" column="customer_id" class="edu.xaut.jzd.Customer" cascade="save-update">
</many-to-one>
注:name属性:表示实体Bean的属性名
column属性:表示数据表中的外键名。
class属性:name属性的类型。
cascade属性:指定哪些操作时级联操作。上述值“save-update”表示在插入或更新时进行级联操作。可以取的值有:persist,merge,delete,save-update,lock等。
一对多(one-to-many)的双向关联关系
建立一对多的双向关联关系只需在以上多对一的关联关系上稍微修改一下即可。具体修改如下:
在customer类中加一个集合(Set)类型的属性。
Customer属性:id,name,Set<Order> orders;
<!--Customer.hbm.xml-->
<set name="orders" column="name" type="string" order-by="order_number asc">
<key column="customer_id"/>
<one-to-many class="edu.xaut.jzd.Order"/>
</set>
注:name:表示集合属性名
key:表示集合属性中的元素(Order对象)中的外键。
注:在实体Bean中封装外键字段时,不要直接进行封装, 而要使用外键所对应的实体Bean作为外键属性的类型。