您的位置:首页 > 其它

Hibernate完成一对多及多对一的关联关系映射

2017-12-23 20:14 357 查看
一对多或多对一

表中的表达:外键指向一的一方主键

对象中的表达:客户实体:使用集合表达一的一方持有多个多的一方private Set<联系人>linkMans;联系人实体:private 客户 Customer;

一对多:(配置文件实体包下的*.hbm.xml)

<!-- 将集合,一对多在配置文件中配置 -->
<!-- name属性:集合属性名
column属性:外键列名
class属性:与我关联的对象的完整类名 -->
<set name="likeMens">
<key column="lkm_cust_id"></key>
<one-to-many class="LinkMan"/>
</set>

多对一:

<!-- 多对一 -->
<many-to-one name="customer"column="lkm_cust_id"class="Customer"></many-to-one>
</class>

public class Customer{
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
//使用set集合表达一对多关系
private Set<LinkMan> linkMens=new HashSet<LinkMan>();
private String cust_phone;
private String cust_mobile;
//省略set/get方法
public class LinkMan {
private Long lkm_id;
private Character lkm_gender;
private String lkm_name;
private String lkm_phone;
private String lkm_email;
private String lkm_qq;
private String lkm_mobile;
private String lkm_memo;
private String lkm_position;
private Customer customer;
//省略set/get方法
创建映射
客户的映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<!-- 主键生成策略 ,就是每条记录录入时,主键的生成规则,identity主键自增
increment:主键自增有hibernate来维护每次插入前会先查询表中id最大值,+1作为新主键值
sequence:oracie中的主键生成策略
hilo:高低位算法主键自增由hibernate来维护
native:hilo+sequence+identity自动三选一策略
uuid:产生随机字符串作为主键,主键类型必须为string
assigned:自然主键生成策略,hibernate不会管理主键由开发人员自己录入
-->
<generator class="native"></generator>
</id>
<!-- 建立类中的普通属性与表中的字段的映射 -->
<property name="cust_name" column="cust_name"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
<!-- 将集合,一对多在配置文件中配置 -->
<!-- name属性:集合属性名
column属性:外键列名
class属性:与我关联的对象的完整类名 -->
<set name="linkMens" cascade="delete,save-update" inverse="true">
<!--cascade级联保存
inverse:true表示放弃维护外键
key:column属性:多的一方的外键的名称-->
<key column="lkm_cust_id"></key>
<one-to-many class="cn.itcast.domain.LinkMan"/>
</set>
</class>
</hibernate-mapping>联系人的映射:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.domain.LinkMan" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<!-- 主键生成策略 ,就是每条记录录入时,主键的生成规则,identity主键自增
increment:主键自增有hibernate来维护每次插入前会先查询表中id最大值,+1作为新主键值
sequence:oracie中的主键生成策略
hilo:高低位算法主键自增由hibernate来维护
native:hilo+sequence+identity自动三选一策略
uuid:产生随机字符串作为主键,主键类型必须为string
assigned:自然主键生成策略,hibernate不会管理主键由开发人员自己录入
-->
<generator class="native"></generator>
</id>
<!-- 建立类中的普通属性与表中的字段的映射 -->
<property name="lkm_gender"/>
<property name="lkm_name"/>
<property name="lkm_phone"/>
<property name="lkm_email"/>
<property name="lkm_qq"/>
<property name="lkm_mobile"/>
<property name="lkm_memo"/>
<property name="lkm_position"/>
<!-- 多对一 -->
<many-to-one name="customer" cascade="save-update" column="lkm_cust_id" class="cn.itcast.domain.Customer"></many-to-one>
</class>
</hibernate-mapping>
将映射添加到配置文件:
<mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
<mapping resource="cn/itcast/domain/LinkMan.hbm.xml"/>
编写测试代码:
public class OnetoMany {
@Test
public void fun1(){
//获得session
Session session=HibernateUtils.getCurrentSession();
//开启事务
Transaction tx=session.beginTransaction();
//操作
Customer c=new Customer();
c.setCust_name("chuanzhiboke");
LinkMan lm1=new LinkMan();
lm1.setLkm_name("liyanhong");
LinkMan lm2=new LinkMan();
lm2.setLkm_name("liyuedong");
//表达一对多客户下有多个联系人
c.getLinkMens().add(lm1);
c.getLinkMens().add(lm2);
//表达联系人属于哪个客户
lm1.setCustomer(c);
lm2.setCustomer(c);
session.save(c);
session.save(lm1);
session.save(lm2);
//提交事务
tx.commit();
}
@Test
//级联保存,只保存一边的问题
//级联是有方向性,保存客户同时级联客户的联系人
public void demo3(){
Session session=HibernateUtils.getCurrentSession();
Transaction tx=session.beginTransaction();
//创建一个客户
Customer customer=new Customer();
customer.setCust_name("liuzong");
LinkMan linkMan1=new LinkMan();
linkMan1.setLkm_name("wangmishu");
customer.getLinkMens().add(linkMan1);
linkMan1.setCustomer(customer);
session.save(customer);
tx.commit();
}}
对表添加外键:

ALTER TBALE cst_linkman

ADD CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES

`cst_customer` (`cust_id`)

遇到的问题需注意:两张表的主键的类型长度以及外键的类型长度都必须一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: