- 一对多的配置
1.画图理解
2.执行步骤(客户和联系人)
(1)创建实体类
(2)在实体类中体现他们一对多关系
package com.sq.entity;
import java.util.HashSet;
import java.util.Set;
/**
*@author sq
*
*/
public class Customer {
private String c_id;
private String c_name;
private Integer age;
//表示一个客户有多个联系人
private Set<LinkedMan> linkedMans = new HashSet<LinkedMan>();
public Set<LinkedMan> getLinkedMans() {
return linkedMans;
}
public void setLinkedMans(Set<LinkedMan> linkedMans) {
this.linkedMans = linkedMans;
}
public String getC_id() {
return c_id;
}
public void setC_id(String c_id) {
this.c_id = c_id;
}
public String getC_name() {
return c_name;
}
public void setC_name(String c_name) {
this.c_name = c_name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Costomer [c_id=" + c_id + ", c_name=" + c_name + ", age=" + age
+ "]";
}
}
package com.sq.entity;
/**
*@author sq
*
*/
public class LinkedMan {
private String l_id;
private String l_name;
private Integer l_age;
//表示一个lianxiren只有一个客户
private Customer customer;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public String getL_id() {
return l_id;
}
public void setL_id(String l_id) {
this.l_id = l_id;
}
public String getL_name() {
return l_name;
}
public void setL_name(String l_name) {
this.l_name = l_name;
}
public Integer getL_age() {
return l_age;
}
public void setL_age(Integer l_age) {
this.l_age = l_age;
}
@Override
public String toString() {
return "LinkedMan [l_id=" + l_id + ", l_name=" + l_name + ", l_age="
+ l_age + "]";
}
}
(3)配置映射文件
(4)在映射文件中体现一对多关系
<?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.sq.entity.LinkedMan" table="t_linkedman">
<id name="l_id">
<generator class="uuid"></generator>
</id>
<property name="l_name"></property>
<property name="l_age"></property>
<!-- 多的一方,实体类只有一个客户所以不需要set标签
name属性值:实体类中表示一的对象名称
class:表示对应一的实体类的全路径
column:表示外键名称,
-->
<many-to-one name="customer" class="com.sq.entity.Customer" column="clid"/>
</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="com.sq.entity.Customer" table="t_customer">
<id name="c_id">
<generator class="uuid"></generator>
</id>
<property name="c_name"></property>
<property name="age"></property>
<!-- 在客户映射文件中,表示所有联系人
使用set标签表示所有联系人
name属性值就是实体类,集合的属性名
-->
<set name="linkedMans">
<!-- 一对多建表
hibernate机制:默认双向维护外键,在一和多那一方都需要配置外键
column属性值就是外键的名称
-->
<key column="clid"></key>
<!-- 客户所有的联系人,class里面写的联系人类的全路径 -->
<one-to-many class="com.sq.entity.LinkedMan"/>
</set>
</class>
</hibernate-mapping>
- 一对多级联更新
在客户中set联系人集合,只需要保存客户,会同时保存联系人信息
<set name="linkedMans" cascade="save-update">
<!-- 一对多建表
hibernate机制:默认双向维护外键,在一和多那一方都需要配置外键
column属性值就是外键的名称
-->
<key column="clid"></key>
<!-- 客户所有的联系人,class里面写的联系人类的全路径 -->
<one-to-many class="com.sq.entity.LinkedMan"/>
</set>
- 一对多级联删除
删除客户时,会同时删除联系人信息
<set name="linkedMans" cascade="save-update,delete">
<!-- 一对多建表
hibernate机制:默认双向维护外键,在一和多那一方都需要配置外键
column属性值就是外键的名称
-->
<key column="clid"></key>
<!-- 客户所有的联系人,class里面写的联系人类的全路径 -->
<one-to-many class="com.sq.entity.LinkedMan"/>
</set>
注意:hibernate机制实现表与表之间关系默认是双向维护的,在修改外键时会发送两次sql语句,因为两个配置文件都有外键,因此需要使用inverse属性,默认false,启用维护,修改为true,即不对另一方维护,可以提高数据更新效率