表与表之间的关系
- 一对多关系。例:客户与联系人
(1)一对一:一个分类里面有多个商品,一个商品只能属于一个分类。
(2)一对多:一个客户有很多联系人,一个联系人只能属于一个客户。 - 多对多关系。例:用户和角色
订单和商品的关系:一个订单里面有很多商品,一个商品属于多个订单。
用户和角色的关系:总经理可以兼任司机,保安可以兼任秘书。
一对多表的实现
以客户与联系人为例,先创建对应的class文件。
//客户的实体类
package cn.zzuli.lhk;
import java.util.HashSet;
import java.util.Set;
public class t_Customer {
private Integer cid;
private String name;
private String gender;
private String work;
private String phone;
private String Mobile;
private Set<t_LinkMan> setLinkMan = new HashSet<t_LinkMan>();
public Set<t_LinkMan> getSetLinkMan() {
return setLinkMan;
}
public void setSetLinkMan(Set<t_LinkMan> setLinkMan) {
this.setLinkMan = setLinkMan;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getWork() {
return work;
}
public void setWork(String work) {
this.work = work;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMobile() {
return Mobile;
}
public void setMobile(String mobile) {
Mobile = mobile;
}
}
//联系人的实体类
package cn.zzuli.lhk;
public class t_LinkMan {
private Integer lid;
private String name;
private String gender;
private String phone;
private Integer clid;
private t_Customer customer;
public Integer getClid() {
return clid;
}
public void setClid(Integer clid) {
this.clid = clid;
}
public t_Customer getCustomer() {
return customer;
}
public void setCustomer(t_Customer customer) {
this.customer = customer;
}
public Integer getLid() {
return lid;
}
public void setLid(Integer lid) {
this.lid = lid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
配置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">
<!-- 客户的xml文件 -->
<hibernate-mapping>
<class name = "cn.zzuli.lhk.t_Customer" table="t_Customer">
<id name = "cid" column = "cid">
<generator class="native"></generator>
</id>
<property name="name" column = "name"></property>
<property name="gender" column = "gender"></property>
<property name="work" column = "work"></property>
<property name="phone" column = "phone"></property>
<property name="Mobile" column = "Mobile"></property>
<!-- name属性值为客户实体类中的联系人集合的名称
双向维护外键,要做到前后外键名称一致
-->
<set name="setLinkMan">
<key column = "clid"></key>
<one-to-many class = "cn.zzuli.lhk.t_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">
<!-- 联系人的xml文件 -->
<hibernate-mapping>
<class name = "cn.zzuli.lhk.t_LinkMan" table = "t_LinkMan">
<id name = "lid" column = "lid">
<generator class="native"></generator>
</id>
<property name="name" column = "name"></property>
<property name="gender" column = "gender"></property>
<property name="phone" column = "phone"></property>
<!-- 双向维护外键
name属性值为联系人实体类中Customer对象名称,这个很重要
-->
<many-to-one name = "customer" class = "cn.zzuli.lhk.t_Customer" column = "clid"></many-to-one>
</class>
</hibernate-mapping>
测试。
package cn.zzuli.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.junit.jupiter.api.Test;
import cn.zzuli.lhk.t_Customer;
import cn.zzuli.lhk.t_LinkMan;
import hibernateUtils.hibernateUtils;
public class hbtest2 {
@Test
public void testadd() {
SessionFactory sessionfactory = null;
//连接
Session session = null;
//开启事务
Transaction tx = null;
try {
sessionfactory = hibernateUtils.getSessionFactoryUtils();
//连接
session = sessionfactory.openSession();
//开启事务
tx = session.beginTransaction();
t_Customer customer = new t_Customer();
customer.setCid(1);
customer.setGender("男");
customer.setName("卓一");
customer.setMobile("15865946624");
customer.setPhone("03740081");
customer.setWork("政协委员");
t_LinkMan linkman = new t_LinkMan();
linkman.setLid(1);
linkman.setName("王二");
linkman.setGender("男");
linkman.setPhone("15265658594");
//linkman.setClid(customer.getCid());
customer.getSetLinkMan().add(linkman);
linkman.setCustomer(customer);
session.save(customer);
session.save(linkman);
tx.commit();
}catch(Exception e){
tx.rollback();
}finally {
session.close();
sessionfactory.close();
}
}
}
得出结论。
个人感悟
这个一对多建表我搞了很长时间,其中印象最深刻的就是配置文件这一过程,由于不细心对后期排查造成了很大困难,出现了各种各样的报错,也想过求援,但是代码是自己敲得,技术上不会了可以问一下子,排查bug的过程必须自己来做,这个感想算是纪念独立解决bug的一天。