客户和联系人是一对多的关系,我们需要使用HIbernate完成客户和联系人的一对多操作,操作步骤如下
步骤一 创建客户和联系人表
创建客户表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
`cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
创建联系人表
CREATE TABLE `cst_linkman` (
`lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',
`lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',
`lkm_cust_id` bigint(32) NOT NULL COMMENT '客户id',
`lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',
`lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',
`lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',
`lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',
`lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',
`lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',
`lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',
PRIMARY KEY (`lkm_id`),
KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),
CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
步骤二 编写客户和联系人的实体类
编写客户实体类
public class Customer {
/*使用包装类,默认值是NULL*/
private Long cust_id;
private String cust_name;
private Long cust_user_id;
private Long cust_create_id;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_linkman;
private String cust_phone;
private String cust_mobile;
// 在一方配置Set 一定要new 出HashSet
private Set<Linkman> linkmans = new HashSet<Linkman>();
// get()和set()方法省略
}
编写联系人实体类
public class Linkman {
private Long lkm_id;
private String lkm_name;
private String lkm_gender;
private String lkm_phone;
private String lkm_mobile;
private String lkm_email;
private String lkm_qq;
private String lkm_position;
private String lkm_memo;
// 在多方配置 此时不能new,应该交给Hibernate来处理
private Customer customer;
// get()和set()方法省略
}
步骤三 编写配映射文件
Customer.hbm.xml的编写
<hibernate-mapping>
<class name="com.hw.Entity.Customer" table="cst_customer">
<id name="cust_id" column="cust_id">
<generator class="native"/>
</id>
<property name="cust_name" column="cust_name"/>
<property name="cust_user_id" column="cust_user_id"/>
<property name="cust_create_id" column="cust_create_id"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_linkman" column="cust_linkman"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
<!--一方的配置格式-->
<set name="linkmans">
<key column="lkm_cust_id"/>
<one-to-many class="com.hw.Entity.Linkman"/>
</set>
</class>
</hibernate-mapping>
Linkman.hbm.xml的编写
<hibernate-mapping>
<class name="com.hw.Entity.Linkman" table="cst_linkman">
<id name="lkm_id" column="cust_id">
<generator class="native"/>
</id>
<property name="lkm_name" column="lkm_name"/>
<property name="lkm_gender" column="lkm_gender"/>
<property name="lkm_phone" column="lkm_phone"/>
<property name="lkm_mobile" column="lkm_mobile"/>
<property name="lkm_email" column="lkm_email"/>
<property name="lkm_qq" column="lkm_qq"/>
<property name="lkm_position" column="lkm_position"/>
<property name="lkm_memo" column="lkm_memo"/>
<!--多方的配置格式-->
<many-to-one name="customer" class="com.hw.Entity.Customer" column="lkm_cust_id"/>
</class>
</hibernate-mapping>
步骤四 编写配置文件
<hibernate-configuration>
<session-factory>
<!--必须配置的参数5个 4大参数和方言-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_learn</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</property>
<!--可选参数-->
<!--显示sql语句-->
<property name="hibernate.show_sql">true</property>
<!--格式化SQL语句-->
<property name="hibernate.format_sql">true</property>
<!--自动创建表
create 每次都创建新表
update 如果没有表创建表
create-drop 每次都创建表然后删除表
validate 校验 生厂环境使用
-->
<property name="hbm2ddl.auto">update</property>
<!--设置数据库的隔离级别 避免高并发读的问题-->
<property name="hibernate.connection.isolation">4</property>
<!--绑定Session到本地线程-->
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="mapper/Customer.hbm.xml"/>
<mapping resource="mapper/Linkman.hbm.xml"/>
</session-factory>
</hibernate-configuration>
步骤五 编写Hibernate的工具类
public class HibernateUtil {
private static final Configuration cfg;
private static final SessionFactory factory;
static{
// 给常量赋值
// 加载配置文件
cfg = new Configuration().configure();
// 生成factory对象
factory = cfg.buildSessionFactory();
}
// 获取Session对象
public static Session openSession(){
return factory.openSession();
}
/*在当前线程中获取Session*/
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}
步骤六 测试
测试双向关联保存
@Test
public void run(){
Session session=HibernateUtil.getCurrentSession();
Transaction transaction=session.beginTransaction();
Customer customer=new Customer();
customer.setCust_name("客户测试一");
Linkman linkman1=new Linkman();
linkman1.setLkm_name("联系人测试一");
Linkman linkman2=new Linkman();
linkman2.setLkm_name("联系人测试二");
//双向关联
linkman1.setCustomer(customer);
linkman2.setCustomer(customer);
customer.getLinkmans().add(linkman1);
customer.getLinkmans().add(linkman2);
/*保存数据*/
session.save(customer);
session.save(linkman1);
session.save(linkman2);
transaction.commit();
}