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方法
客户的映射:
<?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>联系人的映射:
<mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
<mapping resource="cn/itcast/domain/LinkMan.hbm.xml"/>
编写测试代码:
ALTER TBALE cst_linkman
ADD CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES
`cst_customer` (`cust_id`)
遇到的问题需注意:两张表的主键的类型长度以及外键的类型长度都必须一致。
表中的表达:外键指向一的一方主键
对象中的表达:客户实体:使用集合表达一的一方持有多个多的一方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`)
遇到的问题需注意:两张表的主键的类型长度以及外键的类型长度都必须一致。
相关文章推荐
- Hibernate学习---关联关系映射
- Hibernate关联关系映射实例速查
- Hibernate关联关系映射之一对多双向映射
- Hibernate 实体关联关系映射【转】
- myeclipse中配置Hibernate并完成映射文件(首次接触它们)
- Hibernate one to many 关联关系映射
- Hibernate中的关联关系一对一映射
- Hibernate框架中在.hbm.xml映射文件中配置表与表之间的关联关系
- 框架之 hibernate之关联关系映射
- SSH框架之Hibernate的多对多映射、多对多关联关系维护(inverse)
- Hibernate的关联关系映射:(多对多)
- Hibernate - 使用注解完成映射
- Hibernate5笔记5--关联关系映射
- Hibernate之关联关系映射(一对一主键映射和一对一外键映射)
- Hibernate关联关系映射-----双向一对多/多对一映射配置
- Hibernate 映射实体Bean的关联关系
- Hibernate 关联关系映射 -单向关联
- Hibernate关联关系映射目录
- Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
- Hibernate关联关系映射之一对一关联关系