Hibernate学习之一对多(五)

客户和联系人是一对多的关系,我们需要使用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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值