一、表与表之间的关系回顾
一对多建表时,通过外键来建表:
多对多建表时,要维护第三张表:
二、hibernate配置关系数据库之间的关系
(1)配置一对多的映射关系
1、一般一个实体类对应一个映射文件
客户有一个映射文件,联系人有一个映射文件
联系人:
public class LinkMan {
private Integer lkm_id;
private String lkm_name;
private String lkm_gender;
private String lkm_phone;
/**
* 一个联系人只属于一个客户
*/
private Customer customer;
//省略get和set
}
顾客:
public class Customer {
private Integer c_id;
private String c_name;
private String c_source;
private String c_level;
private String c_phone;
private String c_mobile;
/***
* 在客户实体类类里面表示多个联系人,一个客户有多个联系人 hibernate要求使用集合表示多的数据,使用set
*/
private Set<LinkMan> lkmSet = new HashSet<LinkMan>();
//省略get和set
}
2、把映射最基本的配置完成
customer.hbm.xml
<class name="com.winney.entiity.Customer" table="t_customer">
<id name="c_id" column="c_id">
<!-- 该id作为主键并且自增加1 -->
<generator class="native"></generator>
</id>
<property name="c_name" column="c_name"></property>
<property name="c_source" column="c_source"></property>
<property name="c_level" column="c_level"></property>
<property name="c_phone" column="c_phone"></property>
<property name="c_mobile" column="c_mobile"></property>
linkMan.xml
<hibernate-mapping>
<class name="com.winney.entiity.LinkMan" table="t_linkMan">
<id name="lkm_id" column="lkm_id">
<!-- 该id作为主键并且自增加1 -->
<generator class="native"></generator>
</id>
<property name="lkm_name" column="lkm_name"></property>
<property name="lkm_gender" column="lkm_gender"></property>
<property name="lkm_phone" column="lkm_phone"></property>
3、在映射文件中,配置一对多的关系
linkMan.xml:
<many-to-one name="customer" column="clid" class="com.winney.entiity.Customer"></many-to-one>
customer.hbmxml:
<set name="lkmSet">
<key column="clid"></key>
<one-to-many class="com.winney.entiity.LinkMan"/>
</set>
三、一对多级联操作
1、一对多级联保存的复杂方法
首先
要创建两个实体类对象
然后
用代码建立两者之间的联系
最后
用session分别保存两个实体
2、级联保存的简单方法
首先
配置文件,在那那一方配置
<set name="lkmSet" cascade="save-update">
然后
代码操作只针对多的那一方写就好了,但是也是要创建实体类对象,差别就是可以不用session保存一的那一方。
代码实现如下:
ts = session.beginTransaction();
LinkMan linkman = new LinkMan();
linkman.setLkm_name("联系人5");
linkman.setLkm_phone("3785555");
linkman.setLkm_gender("男");
Customer customer = new Customer();
customer.setC_name("顾客4");
customer.setC_phone("37409569");
customer.setC_mobile("1596666");
customer.setC_source("百合网");
// 建立联系
customer.getLkmSet().add(linkman);
// 保存
session.save(customer);
ts.commit();
inverse可以提高性能,inverse为true时表示其中一方对外键的修改依赖另一方;
ts = session.beginTransaction();
ts.begin();
Customer customer = (Customer) session.get(Customer.class, 11);
LinkMan linkman = (LinkMan)session.get(LinkMan.class, 15);
customer.getLkmSet().add(linkman);
linkman.setCustomer(customer);