在实际开发中,大部分表之间的关系为一对多的关系,在这里简单介绍下Hibernate在一对多的情况下mapping映射文件该怎么配置。
以客户Customer和联系人Linkmanwe为例:客户和联系人为一对多的关系。
1,实体类之间的配置
Customer:
private Set<Linkman> linkmans = new HashSet<Linkman>();
Linkman:
private Customer customer;
2,映射文件zhij之间的配置
Customer.hbm.xml:
<set name="linkmans" table="cst_linkman" cascade="save-update,delete" inverse="true">
<key column="lkm_cust_id"></key>
<one-to-many class="com.myself.domain.Linkman"/>
</set>
说明:1,在实体类Customer中我们添加了一个Set<Linkman>的私有属性,而这里的<set>标签就是用来映射set集合属性。
name:实体类中set集合属性的名称;
table:集合元素所对应的数据库表名,一般一对多的关系中不用配置;
cascade:save-update 级联保存,delete级联删除操作,该操作一般配置在一的一方
inverse:true放弃外键维护权,一般配置在一的一方,由多的一方维护外键。(避免在级联操作的时候因Hibernate的缓存快照产生多余的update语句)
2,<key> 用来映射外键字段的。column:从表中外键字段的名称。
3,<one-to-many>用来指定当前映射文件对应的实体类和集合元素对应的实体类属于一对多的关系。class:用来指定集合元素所对应的实体类,当hibernate-mapping未导包,则需要配置该类的全路径包名。
Linkman.hbm.xml:
<many-to-one name="customer" column="lkm_cust_id" class="com.myself.domain.Customer"></many-to-one>
说明:<many-to-one>用来建立多对一的关系映射配置
name:指定实体类中的属性名称
column:从表中的外键字段名称
class:该属性对应的实体类的名称,当hibernate-mapping未导包,则需要配置该类的全路径包名。
3,测试
package com.myself.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import com.myself.domain.Customer;
import com.myself.domain.Linkman;
import com.myself.utils.HibernateUtils;
public class ManyToOneTest {
@Test
public void testManyToOne(){
Customer customer = new Customer();
customer.setName("菜鸟集中营");
Linkman linkman1 = new Linkman();
linkman1.setName("张三");
Linkman linkman2 = new Linkman();
linkman1.setName("李四");
customer.getLinkmans().add(linkman1);
customer.getLinkmans().add(linkman2);
linkman1.setCustomer(customer);
linkman2.setCustomer(customer);
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
session.save(customer);
transaction.commit();
session.close();
}
}
4,结果: