框架漫谈之hibernate(四)hibernate一对多、多对多实体类xml配置
2017-09-18 00:30
323 查看
1.数据库建表SQL
create database test_hibernate; use test_hibernate; /*创建客户表*/ CREATE TABLE `cst_customer` ( `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)', `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)', `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源', `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业', `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别', `cust_address` varchar(128) DEFAULT NULL COMMENT '客户联系地址', `cust_phone` varchar(64) 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_gender` varchar(10) 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_position` varchar(16) DEFAULT NULL COMMENT '联系人职位', `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注', PRIMARY KEY (`lkm_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; /*创建用户表*/ CREATE TABLE `sys_user` ( `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id', `user_code` varchar(32) NOT NULL COMMENT '用户账号', `user_name` varchar(64) NOT NULL COMMENT '用户名称', `user_password` varchar(32) NOT NULL COMMENT '用户密码', `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停', PRIMARY KEY (`user_id`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; /*创建角色表*/ create table `sys_role`( role_id bigint(32) primary key auto_increment, role_name varchar(100), role_memo varchar(255) ); /*创建用户和角色关联系表*/ CREATE TABLE `sys_user_role` ( `role_id` bigint(32) NOT NULL COMMENT '角色id', `user_id` bigint(32) NOT NULL COMMENT '用户id', PRIMARY KEY (`role_id`,`user_id`), KEY `FK_user_role_user_id` (`user_id`), CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION )
学习hibernate中多表映射应该遵循步骤:
1、明确表之前确实是如你所想的关系
2、在数据库中是SQL语句建立他们的之间的关系
3、在实体类中描述出两个实体之间的关系
4、在映射配置文件中建立他们的关系映射
2.客户联系人一对多
/** * 客户的实体类 * @author ZhuPengWei */ public class Customer implements Serializable { private Long custId; private String custName; private String custSource; private String custIndustry; private String custLevel; private String custAddress; private String custPhone; //一对多关系映射:一个客户可以包含多个联系人 private Set<LinkMan> linkmans = new HashSet<LinkMan>(0); //提供对外访问的setter,getter ....... }
<?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 package="test.domain"> <class name="Customer" table="cst_customer"> <id name="custId" column="cust_id"> <generator class="native"></generator> </id> <property name="custName" column="cust_name"></property> <property name="custIndustry" column="cust_industry"></property> <property name="custSource" column="cust_source"></property> <property name="custLevel" column="cust_level"></property> <property name="custAddress" column="cust_address"></property> <property name="custPhone" column="cust_phone"></property> <!-- 一对多关系映射: 涉及的标签: set: 作用:用于映射set集合属性。 属性: name:指定集合属性的名称 table:指定集合元素所对应的表。在一对多时,table属性可以不写。 one-to-many: 作用:指定当前映射文件所对应的实体和集合元素之间的关系是一对多。 属性: class:指定集合元素所对应的实体类名称 key: 作用:用于映射外键的。 属性: column:指定外键字段名称。 --> <set name="linkmans" table="cst_linkman" > <key column="lkm_cust_id"/> <one-to-many class="LinkMan"/> </set> </class> </hibernate-mapping>
/** * 一个联系人的实体 * @author ZhuPengWei */ public class LinkMan implements Serializable { private Long lkmId; private String lkmName; private String lkmGender; private String lkmPhone; private String lkmMobile; private String lkmEmail; private String lkmPosition; private String lkmMemo; //多对一关系映射:多个联系人对应一个客户 private Customer customer; //提供对外访问的setter,getter ....... }
<?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 package="test.domain"> <class name="LinkMan" table="cst_linkman"> <id name="lkmId" column="lkm_id"> <generator class="native"></generator> </id> <property name="lkmName" column="lkm_name"></property> <property name="lkmGender" column="lkm_gender"></property> <property name="lkmPhone" column="lkm_phone"></property> <property name="lkmMobile" column="lkm_mobile"></property> <property name="lkmEmail" column="lkm_email"></property> <property name="lkmPosition" column="lkm_position"></property> <property name="lkmMemo" column="lkm_memo"></property> <!-- 多对一关系映射 涉及的标签: many-to-one 作用:用于映射多对一的关系 属性: name:指的实体类中引用客户实体的属性名称 column:指的是从表中外键字段的名称 class:指定的是属性所对应的实体类 --> <many-to-one name="customer" class="Customer" column="lkm_cust_id"></many-to-one> </class> </hibernate-mapping>
3.用户角色多对多
/** * 角色的实体类 * @author ZhuPengWei */ public class SysRole implements Serializable { private Long roleId; private String roleName; private String roleMemo; //多对多关系映射:一个角色可以赋予多个用户 private Set<SysUser> users = new HashSet<SysUser>(0); //对外提供setter,getter ....... }
<?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 package="test.domain"> <class name="SysRole" table="sys_role"> <id name="roleId" column="role_id"> <generator class="native"></generator> </id> <property name="roleName" column="role_name"></property> <property name="roleMemo" column="role_memo"></property> <!-- 多对多关系映射 --> <set name="users" table="user_role_ref" > <key column="role_id"/> <many-to-many class="SysUser" column="user_id"/> </set> </class> </hibernate-mapping>
/** * 一个用户实体 * @author ZhuPengWei */ public class SysUser implements Serializable { private Long userId; private String userCode; private String userName; private String userPassword; private String userState; //多对多关系映射:一个用户可以有多个角色 private Set<SysRole> roles = new HashSet<SysRole>(0); //对外提供setter,getter ....... }
<?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 package="test.domain"> <class name="SysUser" table="sys_user"> <id name="userId" column="user_id"> <generator class="native"></generator> </id> <property name="userCode" column="user_code"></property> <property name="userName" column="user_name"></property> <property name="userPassword" column="user_password"></property> <property name="userState" column="user_state"></property> <!-- 多对多的关系映射 --> <set name="roles" table="user_role_ref" > <key column="user_id"/> <many-to-many class="SysRole" column="role_id"/> </set> </class> </hibernate-mapping>
相关文章推荐
- Hibernate框架 主配置文件(Hibernate.cfg.xml)基本
- 【hibernate框架】uuid与native生成ID的样例-XML配置
- 框架漫谈之hibernate(二)hibernate配置以及入门案例
- 使用eclipse开发spring,hibernate,mybatis等框架的xml配置文件时代码不自动提示
- struts2,hibernate,spring三大框架整合的注册程序(xml 配置,mysql数据库)
- 【hibernate框架】如何配置联合主键-XML与Annotation样例剖析
- Struts+Spring+Hibernate实现上传下载(spring的最低框架配置,web.xml等)
- 根据Hibernate 实体类配置的xml 生成数据库表代码
- Hibernate框架中hibernate.properties属性文件,hibernate.cfg.xml配置文件,以及Users.hbm.xml映射文件的配置
- Spring+SpringMVC+Hibernate框架完整版配置(基于xml)
- Hibernate框架中在.hbm.xml映射文件中配置表与表之间的关联关系
- Idea下Hibernate手动配置好实体类和hbm.xml后自动生成数据库表报错
- hibernate 非xml实体类配置方法!
- Hibernate实体类注解配置与xml配置
- Hibernate框架 主配置文件 Hibernate.cfg.xml 映射配置 说明
- 关于ssh 框架 applicationContext.xml文件中配置hibernate数据库出现的一个小问题
- 两个在不同包下的 相同的实体类, 为怎么不能同时在hibernate.cfg.xml 中配置?
- 关于搭建restful web service + springMVC + ibatis/hibernate的整合和XML配置意思和ssh+springMVC框架搭建
- UserDao找不到,框架集成,springMVC和hibernate和Spring 保错。tomcat保错。。UserDao 找不到在spring-servlet.xml配置
- hibernate框架的核心配置文件=====hibernate.cfg.xml