一对多案例
假设一个客户有多个联系人,客户和联系人是一对多的关系,他们的数据表如下,客户表的主键是联系人表的外键,在联系人表知道外键值通过查询客户表,就可以知道联系人对应的客户的相关信息 
javaBean和配置文件
在hibernate框架处理一对多的关系,关键要写好数据表对应的javaBean和配置文件
一方:在CustomerBean.java里面,要添加set集合,代表客户所以对应的联系人
然后在配置文件,配置set集合,具体写法参照下面的代码
多方:在LinkManBean.java里面,要添加Customer对象,代表联系人所对应的客户
然后在配置文件,具体写法参照下面的代码
Customer.java
public class Customer {
private Long cust_id;
private String cust_name;
// Hibernate框架默认的集合是set集合,集合必须要自己手动的初始化
private Set<Linkman> linkmans = new HashSet<Linkman>();
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
public String getCust_name() {
return cust_name;
}
public void setCust_name(String cust_name) {
this.cust_name = cust_name;
}
public Set<Linkman> getLinkmans() {
return linkmans;
}
public void setLinkmans(Set<Linkman> linkmans) {
this.linkmans = linkmans;
}
}Customer.hbm.xml
<?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="com.itheima.domain.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>
<property name="cust_name" column="cust_name"/>
<!-- 配置一方 -->
<!--
set标签name属性:表示集合的名称
-->
<set name="linkmans" inverse="true">
<!-- 需要出现子标签 -->
<!-- 外键的字段 -->
<key column="lkm_cust_id"/>
<one-to-many class="com.itheima.domain.Linkman"/>
</set>
</class>
</hibernate-mapping> LinkMan.java
public class Linkman {
private Long lkm_id;
private String lkm_name;
// 编写一个对象,不要自己new
private Customer customer;
public Long getLkm_id() {
return lkm_id;
}
public void setLkm_id(Long lkm_id) {
this.lkm_id = lkm_id;
}
public String getLkm_name() {
return lkm_name;
}
public void setLkm_name(String lkm_name) {
this.lkm_name = lkm_name;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
}Linkman.hbm.xml
<?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="com.itheima.domain.Linkman" table="cst_linkman">
<id name="lkm_id" column="lkm_id">
<generator class="native"/>
</id>
<property name="lkm_name" column="lkm_name"/>
<!-- 先配置多方
name 当前JavaBean中的属性
class 属性的全路径
column 外键的字段
-->
<many-to-one name="customer" class="com.itheima.domain.Customer" column="lkm_cust_id" cascade="save-update"/>
</class>
</hibernate-mapping>级联删除,级联保存
1. 需要大家掌握的取值如下
* none -- 不使用级联
* save-update -- 级联保存或更新
* delete -- 级联删除
* delete-orphan -- 孤儿删除.(注意:只能应用在一对多关系)
* all -- 除了delete-orphan的所有情况.(包含save-update delete)
* all-delete-orphan -- 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
2. 孤儿删除(孤子删除),只有在一对多的环境下才有孤儿删除
* 在一对多的关系中,可以将一的一方认为是父方.将多的一方认为是子方.孤儿删除:在解除了父子关系的时候.将子方记录就直接删除。
* <many-to-one cascade="delete-orphan" />
级联保存效果
* 级联保存:保存一方同时可以把关联的对象也保存到数据库中!!
* 使用cascade=”save-update”
上述的删除是普通的删除,那么也可以使用级联删除,注意:级联删除也是有方向性的!!
*
技术分析之让某一方放弃外键的维护,为多对多做准备
1. 先测试双方都维护外键的时候,会产生多余的SQL语句。
* 想修改客户和联系人的关系,进行双向关联,双方都会维护外键,会产生多余的SQL语句。
* 产生的原因:session的一级缓存中的快照机制,会让双方都更新数据库,产生了多余的SQL语句。
2. 如果不想产生多余的SQL语句,那么需要一方来放弃外键的维护!
* 在<set>标签上配置一个inverse=”true”.true:放弃.false:不放弃.默认值是false
* <inverse="true">
技术分析之cascade和inverse的区别
1. cascade用来级联操作(保存、修改和删除)
2. inverse用来维护外键的
版权声明:本文为mozha_666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。