Hibernate-12-新加联系人操作

Hibernate-12-新加联系人操作

一:客户Customer

二:联系人Linkman

JavaBean
Customer:

package com.feizhu.domain;


import java.util.HashSet;
import java.util.Set;


/**
 * 客户
 * 一方
 * @author Administrator
 *
 */
public class 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 '移动电话',
//

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 Set<Linkman> getLinkmans() {
return linkmans;
}


public void setLinkmans(Set<Linkman> linkmans) {
this.linkmans = linkmans;
}


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;
}


}

------------------

Customer映射文件:
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.feizhu.domain.Customer"  table="cst_customer"> 
      
         <!-- 配置id 
           见到name属性,javaBean的属性
           见到column属性,是表结构的字段
         
         -->
          <id  name="cust_id"  column="cust_id">
             <!-- 主键的生成策略 -->
             <generator class="native"></generator>
          </id>
          
          <!-- 配置其他属性 -->
          <property name="cust_name"  column="cust_name"></property>
          <property name="cust_user_id"  column="cust_user_id"></property>
          <property name="cust_create_id"  column="cust_create_id"></property>
          
          <property name="cust_source"  column="cust_source"></property>
          <property name="cust_industry"  column="cust_industry"></property>
          <property name="cust_level"  column="cust_level"></property>
          
          <property name="cust_linkman"  column="cust_linkman"></property>
          <property name="cust_phone"  column="cust_phone"></property>
          <property name="cust_mobile"  column="cust_mobile"></property>
          
          <!-- 配置一方 -->
          <!-- 
              set标签name属性:表示集合的名称
           -->
           <set name="linkmans">
           <!-- 需要出现子标签 -->
           <!-- 外键的字段 -->
           <key column="lkm_cust_id"></key>
            <one-to-many class="com.feizhu.domain.Linkman"/>
           </set>

     </class>
    

    </hibernate-mapping>

---------------

Linkman
package com.feizhu.domain;


/**
 * 联系人
 * 多方
 * @author Administrator
 *
 */
public class Linkman {


/*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;*/

   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;
   
   //联系人所属客户
   private Customer customer;
   
public Long getLkm_id() {
return lkm_id;
}
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
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;
}
   

}

Linkman映射文件:
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.feizhu.domain.Linkman" table="cst_linkman">


<!-- 配置id 见到name属性,javaBean的属性 见到column属性,是表结构的字段 -->
<id name="lkm_id" column="lkm_id">
<!-- 主键的生成策略 -->
<generator class="native"></generator>
</id>


<!-- 配置其他属性 -->
<property name="lkm_name" column="lkm_name"></property>
<property name="lkm_gender" column="lkm_gender"></property>


<property name="lkm_phone" column="lkm_phone"></property>
<property name="lkm_mobile" column="lkm_mobile"></property>
<property name="lkm_email" column="lkm_email"></property>


<property name="lkm_qq" column="lkm_qq"></property>
<property name="lkm_position" column="lkm_position"></property>
<property name="lkm_memo" column="lkm_memo"></property>


           <!-- 先配置多方 
             name    当前JavaBean中(一方)的属性
             class   属性的全路径
             column  外键的字段
           -->


         <many-to-one name="customer" class="com.feizhu.domain.Customer" column="lkm_cust_id"></many-to-one>

</class>


</hibernate-mapping>


-----------------

核心配置文件:

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>


<!-- 记住:先配置SessionFactory标签,一个数据库对应一个SessionFactory -->


<session-factory>


<!-- 必须要配置的参数有5个,数据库的方言 -->


<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hbn2</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>


<!-- 数据库的方言 -->
<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>
<!-- 生成数据库的表结构 update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 绑定本地session -->
<property name="hibernate.current_session_context_class">thread</property>


<!-- 映射配置文件,需要引入映射的配置文件 -->
<mapping resource="com/feizhu/domain/Customer.hbm.xml"></mapping>
<mapping resource="com/feizhu/domain/Linkman.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

---------------

SQL

create database hbn2;

use hbn2;

客户表:

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;


联系人表:

EATE 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;

--------------------------

工具类: HibernateUtil 
package com.feizhu.utils;


import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


public class HibernateUtil {


// 会话工厂,以单例方式管理
private static SessionFactory sessionFactory;


// ThreadLocal存储session
private static ThreadLocal<Session> session = new ThreadLocal<Session>();




// 以单例方式管理sessionFactory
static {
try {
sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
} catch (HibernateException e) {
e.printStackTrace();
throw new HibernateException("初始化会话工厂失败!");
}


}
//得到一个单例的会话工厂
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
//获取一个新session
public static Session openSession(){
return sessionFactory.openSession();
}

//获取当前与线程绑定的session,如果获取不到则创建一个新session并与当前线程绑定
// public static Session getCurrentSession() throws HibernateException {
// //获取当前线程绑定的session
// Session s = (Session) session.get();
// if (s == null) {
// //创建一个新session
// s = sessionFactory.openSession();
// //新session并与当前线程绑定
// session.set(s);
// }
// return s;
// }
 
public static Session getCurrentSession() throws HibernateException {
return sessionFactory.getCurrentSession(); 
}
//关闭当前线程绑定的session
// public static void closeSession() throws HibernateException {
// //获取当前线程绑定的session
// Session s = (Session) session.get();
// if (s != null){
// //关闭session
// s.close(); 
// }
// session.set(null);
// }

public static void closeSession() throws HibernateException {
sessionFactory.getCurrentSession().close();
}
}

------

Servlet:

package com.feizhu.servlet;


import java.io.IOException;
import java.util.Map;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.apache.commons.beanutils.BeanUtils;


import com.feizhu.domain.Linkman;
import com.feizhu.service.AddLinkManService;


/**
 * 新增联系人
 */
public class AddLinkManServlet extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


//设置编码
request.setCharacterEncoding("utf-8");
//接受参数
Map<String, String[]> map = request.getParameterMap();
//获取id
String scust_id =map.get("cust_id")[0];


//类型转换
Long cust_id=Long.parseLong(scust_id);
//创建对象
Linkman man = new Linkman();
//封装数据
try {
BeanUtils.populate(man, map);
//调用业务层
new AddLinkManService().addLinkMan(man,cust_id);
System.out.println("保存联系人成功");
} catch (Exception e) {
e.printStackTrace();


}


protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}


}

Service:

package com.feizhu.service;


import java.util.Map;


import org.hibernate.Session;
import org.hibernate.Transaction;


import com.feizhu.dao.AddLinkManDao;
import com.feizhu.domain.Customer;
import com.feizhu.domain.Linkman;
import com.feizhu.utils.HibernateUtil;


public class AddLinkManService {


/**
* 编写业务,保存联系人 先把客户查出来,给联系人设置客户,保存联系人

* @param man
* @param cust_id
*/
public void addLinkMan(Linkman man, Long cust_id) {
// 获取session
Session session = HibernateUtil.getCurrentSession();
// 开启事物
Transaction tr = session.beginTransaction();


try {
// 调用dao层 根据id查询客户
Customer customer = new AddLinkManDao().findById(cust_id);
//设置
man.setCustomer(customer);
//保存联系人
  new AddLinkManDao().save(man);
// 提交事物
tr.commit();
} catch (Exception e) {
e.printStackTrace();
//出现异常 回滚事物
tr.rollback();
}


}


}

Dao:
package com.feizhu.dao;


import org.hibernate.Session;


import com.feizhu.domain.Customer;
import com.feizhu.domain.Linkman;
import com.feizhu.utils.HibernateUtil;


public class AddLinkManDao {


/**
* 根据id查询客户

* @param cust_id
* @return 
*/


public Customer findById(Long cust_id) {


//使用session
Session session = HibernateUtil.getCurrentSession();
//查询 返回一个客户
return session.get(Customer.class, cust_id);
}


/**
* 保存联系人
* @param man
*/
public void save(Linkman man) {


//使用session
Session session = HibernateUtil.getCurrentSession();
//保存练习人
session.save(man);

}


}

----------------------------

jar包等