hibernate框架双向一对多例子(十一)

来源:互联网 发布:java导出csv文件乱码 编辑:程序博客网 时间:2024/05/19 14:15

一方Customer,多方Linkman

一、创建数据库

hibernate_second

创建两张表:

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=3 DEFAULT CHARSET=utf8;

二、创建web项目

项目结构:


所需jar包:


三、在src目录下创建hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><!-- 先配置session-factory标签,一个数据库对应一个SessionFactory --><session-factory><!-- 必须配置的4大参数 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:mysql:///hibernate_second?useUnicode=true&characterEncoding=UTF-8</property><property name="hibernate.connection.username">root</property><property name="hibernate.connection.password">123456</property><!-- 数据库的方言(必须配置的) --><!-- 方言的作用:底层用了什么数据库,告诉hibernate,hibernate会生成对应的sql语句 --><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 可选的配置 --><!-- 显示sql语句 --><property name="hibernate.show_sql">true</property><!-- 格式化sql语句 --><property name="hibernate.format_sql">true</property><!-- 生成数据库的表结构。hbm2ddl-hbm to ddl,意思是把映射文件去生成数据库定义的语言 --><!-- 1.create,每次都创建一张新的表。开发中不会用的。 --><!-- 2.create-drop,先创建,再删除。根本没什么用嘛! --><!-- 3.create-drop,先创建,再删除。根本没什么用嘛! --><!-- 4.update,如果没有表就创建。有新的字段,会添加到表中。但是javabean中少了属性,不会去删除表中的字段。对于字段,只能加,不能删 --><!-- 5.validate,校验javabean属性和数据库表的字段是不是一致的。 --><!-- 开发一般用update --><property name="hibernate.hbm2ddl.auto">update</property><!-- 开启绑定本地session --><property name="hibernate.current_session_context_class">thread</property><!-- 引入映射配置文件(一定要注意,要引入映射文件,框架需要加载映射文件) --></session-factory></hibernate-configuration>

四、创建javabean

package com.hib.domain;import java.util.HashSet;import java.util.Set;/** * 客户的JavaBean 一方 *  * @author Administrator */public class Customer {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;// 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 Long getCust_user_id() {return cust_user_id;}public void setCust_user_id(Long cust_user_id) {this.cust_user_id = cust_user_id;}public Long getCust_create_id() {return cust_create_id;}public void setCust_create_id(Long cust_create_id) {this.cust_create_id = cust_create_id;}public String getCust_source() {return cust_source;}public void setCust_source(String cust_source) {this.cust_source = cust_source;}public String getCust_industry() {return cust_industry;}public void setCust_industry(String cust_industry) {this.cust_industry = cust_industry;}public String getCust_level() {return cust_level;}public void setCust_level(String cust_level) {this.cust_level = cust_level;}public String getCust_linkman() {return cust_linkman;}public void setCust_linkman(String cust_linkman) {this.cust_linkman = cust_linkman;}public String getCust_phone() {return cust_phone;}public void setCust_phone(String cust_phone) {this.cust_phone = cust_phone;}public String getCust_mobile() {return cust_mobile;}public void setCust_mobile(String cust_mobile) {this.cust_mobile = cust_mobile;}public Set<Linkman> getLinkmans() {return linkmans;}public void setLinkmans(Set<Linkman> linkmans) {this.linkmans = linkmans;}}
package com.hib.domain;/** * 客户的联系人 多方 *  * @author Administrator */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;// 编写一个对象,不要自己newprivate 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 String getLkm_gender() {return lkm_gender;}public void setLkm_gender(String lkm_gender) {this.lkm_gender = lkm_gender;}public String getLkm_phone() {return lkm_phone;}public void setLkm_phone(String lkm_phone) {this.lkm_phone = lkm_phone;}public String getLkm_mobile() {return lkm_mobile;}public void setLkm_mobile(String lkm_mobile) {this.lkm_mobile = lkm_mobile;}public String getLkm_email() {return lkm_email;}public void setLkm_email(String lkm_email) {this.lkm_email = lkm_email;}public String getLkm_qq() {return lkm_qq;}public void setLkm_qq(String lkm_qq) {this.lkm_qq = lkm_qq;}public String getLkm_position() {return lkm_position;}public void setLkm_position(String lkm_position) {this.lkm_position = lkm_position;}public String getLkm_memo() {return lkm_memo;}public void setLkm_memo(String lkm_memo) {this.lkm_memo = lkm_memo;}public Customer getCustomer() {return customer;}public void setCustomer(Customer customer) {this.customer = customer;}}

五、创建映射配置文件

5.1 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.hib.domain.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属性:表示集合的名称 --><set name="linkmans"><key column="lkm_cust_id"></key><!-- 为什么要one-to-many的class? private Set<Linkman> linkmans = new HashSet<Linkman>(); 这里要用到Linkman,也要通过反射去创建  --><one-to-many class="com.hib.domain.Linkman" /></set></class></hibernate-mapping>    

5.2 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.hib.domain.Linkman" table="cst_linkman"><id name="lkm_id" column="lkm_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"/><!-- 先配置多方 name当前JavaBean中的属性class属性的全路径。为什么需要这个全路径呢?在Linkman的private Customer customer,不要自己new。那么要用它就由hibernate框架通过反射的方式来封装。column外键的字段--><many-to-one name="customer" class="com.hib.domain.Customer" column="lkm_cust_id"></many-to-one></class></hibernate-mapping>

六、在hibernate.cfg.xml中引入映射配置文件

<!-- 引入映射配置文件(一定要注意,要引入映射文件,框架需要加载映射文件) --><mapping resource="com/hib/domain/Customer.hbm.xml" /><mapping resource="com/hib/domain/Linkman.hbm.xml" />

七、创建测试类

package com.hib.test;import org.hibernate.Session;import org.hibernate.Transaction;import org.junit.Test;import com.hib.domain.Customer;import com.hib.domain.Linkman;import com.hib.utils.HibernateUtils;/** * 测试一对多 * */public class Demo1 {/** * 双向关联的方式,保存数据 */@Testpublic void run1() {Session session = HibernateUtils.getCurrentSession();Transaction tx = session.beginTransaction();// 保存客户和联系人的数据Customer c1 = new Customer();c1.setCust_name("美美");// 创建2个联系人Linkman l1 = new Linkman();l1.setLkm_name("熊大");Linkman l2 = new Linkman();l2.setLkm_name("熊二");// 演示双向关联c1.getLinkmans().add(l1);// linkmans集合new过了,可以直接装东西c1.getLinkmans().add(l2);l1.setCustomer(c1);l2.setCustomer(c1);// 保存数据session.save(c1);session.save(l1);session.save(l2);tx.commit();}}

八、执行单元测试





注意:三个insert语句执行完了之后,还执行了两个update语句,用于维护linkman中的外键

源码下载


原创粉丝点击