Hibernate进阶学习3
Hibernate进阶学习3
测试hibernate的多表关联操作(一对多,多对一,多对多)
表之间的关系主要在类与元数据配置文件中体现
- package com.hibernate.domain;
- import java.util.HashSet;
- import java.util.Set;
- public class Customer {
- private Long cust_id;
- private String cust_name;
- 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集合,表达一对多关系
- */
- private Set<LinkMan> linkMens = new HashSet<LinkMan>();
- public Set<LinkMan> getLinkMens() {
- return linkMens;
- }
- public void setLinkMens(Set<LinkMan> linkMens) {
- this.linkMens = linkMens;
- }
- 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 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;
- }
- @Override
- public String toString() {
- return "Customer [cust_id=" + cust_id + ", " +
- "cust_name=" + cust_name + "]";
- }
- }
- <?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="com.hibernate.domain">
- <!-- class元素: 配置实体与表的对应关系的 -->
- <class name="Customer" table="cst_customer">
- <!-- id元素:配置主键映射的属性 -->
- <id name="cust_id">
- <!-- generator:主键生成策略,每条数据录入时,主键的生成规则 -->
- <generator class="native"></generator>
- </id>
- <!-- property元素:除id之外的普通属性映射 -->
- <property name="cust_name" column="cust_name"></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>
- <!-- 集合,一对多关系,在配置文件中配置 -->
- <!-- name属性:集合属性名
- column属性:外键列名
- class属性:与我关联的对象完整类名 -->
- <!-- 级联操作:cascade
- save-update:级联保存更新
- delete:级联删除
- all:save-update+delete
- 级联操作:简化操作,目的就是为了少写两行代码 -->
- <!-- inverse属性:配置关系是否维护
- true:customer不维护关系
- false(默认值):customer维护关系
- inverse属性:性能优化,提高关系维护的性能
- 原则:无论怎么放弃,总有一方必须要维护关系
- 一对多关系中:一的一方放弃,也只能一的一方放弃,多的一方不能放弃 -->
- <set name="linkMens" inverse="true" cascade="delete">
- <key column="lkm_cust_id"></key>
- <one-to-many class="LinkMan"/>
- </set>
- </class>
- </hibernate-mapping>
- package com.hibernate.domain;
- public class LinkMan {
- private Long lkm_id;
- private Character lkm_gender;
- private String lkm_name;
- private String lkm_phone;
- private String lkm_email;
- private String lkm_qq;
- private String lkm_mobile;
- private String lkm_memo;
- private String lkm_position;
- /**
- * 表达多对一关系
- */
- private Customer customer;
- public Customer getCustomer() {
- return customer;
- }
- public void setCustomer(Customer customer) {
- this.customer = customer;
- }
- public Long getLkm_id() {
- return lkm_id;
- }
- public void setLkm_id(Long lkm_id) {
- this.lkm_id = lkm_id;
- }
- public Character getLkm_gender() {
- return lkm_gender;
- }
- public void setLkm_gender(Character lkm_gender) {
- this.lkm_gender = lkm_gender;
- }
- public String getLkm_name() {
- return lkm_name;
- }
- public void setLkm_name(String lkm_name) {
- this.lkm_name = lkm_name;
- }
- public String getLkm_phone() {
- return lkm_phone;
- }
- public void setLkm_phone(String lkm_phone) {
- this.lkm_phone = lkm_phone;
- }
- 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_mobile() {
- return lkm_mobile;
- }
- public void setLkm_mobile(String lkm_mobile) {
- this.lkm_mobile = lkm_mobile;
- }
- public String getLkm_memo() {
- return lkm_memo;
- }
- public void setLkm_memo(String lkm_memo) {
- this.lkm_memo = lkm_memo;
- }
- public String getLkm_position() {
- return lkm_position;
- }
- public void setLkm_position(String lkm_position) {
- this.lkm_position = lkm_position;
- }
- }
- <?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="com.hibernate.domain">
- <class name="LinkMan" table="cst_linkman">
- <id name="lkm_id">
- <generator class="native"></generator>
- </id>
- <property name="lkm_gender"></property>
- <property name="lkm_name"></property>
- <property name="lkm_phone"></property>
- <property name="lkm_email"></property>
- <property name="lkm_qq"></property>
- <property name="lkm_mobile"></property>
- <property name="lkm_memo"></property>
- <property name="lkm_position"></property>
- <!-- 多对一 -->
- <!-- name属性:引用属性名
- column属性:外键列名
- class属性:与我关联的对象完整类名 -->
- <!-- 级联操作:cascade
- save-update:级联保存更新
- delete:级联删除
- all:save-update+delete
- 级联操作:简化操作,目的就是为了少写两行代码 -->
- <!-- 多的一方:不能放弃维护关系的,外键字段就在多的一方 -->
- <many-to-one name="customer" column="lkm_cust_id" class="Customer">
- </many-to-one>
- </class>
- </hibernate-mapping>
- package com.hibernate.domain;
- import java.util.HashSet;
- import java.util.Set;
- public class Role {
- private Long role_id;
- private String role_name;
- private String role_memo;
- /**
- * 表达多对多
- */
- private Set<User> users = new HashSet<User>();
- public Long getRole_id() {
- return role_id;
- }
- public void setRole_id(Long role_id) {
- this.role_id = role_id;
- }
- public String getRole_name() {
- return role_name;
- }
- public void setRole_name(String role_name) {
- this.role_name = role_name;
- }
- public String getRole_memo() {
- return role_memo;
- }
- public void setRole_memo(String role_memo) {
- this.role_memo = role_memo;
- }
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- }
- <?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="com.hibernate.domain">
- <class name="Role" table="sys_role">
- <id name="role_id">
- <generator class="native"></generator>
- </id>
- <property name="role_name"></property>
- <property name="role_memo"></property>
- <!-- 使用inverse属性
- true:放弃维护外键关系
- false(默认值):维护关系
- 结论:将来在开发中,如果遇到多对多关系,一定要选择一方放弃维护关系;
- 一般谁来放弃要看业务方向,例如录入员工时,需要为员工指定所属角色,
- 那么业务方向就是由员工维护角色,角色不需要维护与员工关系,角色放弃维护 -->
- <set name="users" table="sys_user_role" inverse="true">
- <key column="role_id"></key>
- <many-to-many class="User" column="user_id"></many-to-many>
- </set>
- </class>
- </hibernate-mapping>
- package com.hibernate.domain;
- import java.util.HashSet;
- import java.util.Set;
- public class User {
- private Long user_id;
- private String user_code;
- private String user_name;
- private String user_password;
- private Character user_state;
- /**
- * 表达多对多
- */
- private Set<Role> roles = new HashSet<Role>();
- public Long getUser_id() {
- return user_id;
- }
- public void setUser_id(Long user_id) {
- this.user_id = user_id;
- }
- public String getUser_code() {
- return user_code;
- }
- public void setUser_code(String user_code) {
- this.user_code = user_code;
- }
- public String getUser_name() {
- return user_name;
- }
- public void setUser_name(String user_name) {
- this.user_name = user_name;
- }
- public String getUser_password() {
- return user_password;
- }
- public void setUser_password(String user_password) {
- this.user_password = user_password;
- }
- public Character getUser_state() {
- return user_state;
- }
- public void setUser_state(Character user_state) {
- this.user_state = user_state;
- }
- public Set<Role> getRoles() {
- return roles;
- }
- public void setRoles(Set<Role> roles) {
- this.roles = roles;
- }
- }
- <?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="com.hibernate.domain">
- <class name="User" table="sys_user">
- <id name="user_id">
- <generator class="native"></generator>
- </id>
- <property name="user_code"></property>
- <property name="user_name"></property>
- <property name="user_password"></property>
- <property name="user_state"></property>
- <!-- 多对多关系表达 -->
- <!-- name:集合属性名
- table:配置中间表名
- key
- |-column:外键,别人引用"我"的外键列名
- class:我与哪个类是多对多关系
- column:外键,我引用比人的外键列名 -->
- <!-- cascade级联操作:
- save-update:级联保存更新
- delete:级联删除
- all:级联保存更新+级联删除
- 结论:cascade简化代码书写,该属性使不使用无所谓,建议要用只用save-update
- 如果使用delete操作太过危险,尤其在多对多中,不建议使用 -->
- <set name="roles" table="sys_user_role" cascade="save-update">
- <key column="user_id"></key>
- <many-to-many class="Role" column="role_id"></many-to-many>
- </set>
- </class>
- </hibernate-mapping>
测试一对多,多对一
- package com.hibernate.onetomany;
- import com.hibernate.domain.Customer;
- import com.hibernate.domain.LinkMan;
- import com.hibernate.utils.HibernateUtils;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
- /**
- * @author: XDZY
- * @date: 2018/11/18 19:38
- * @description: 测试一对多操作
- */
- public class Demo01 {
- /**
- * 添加客户和联系人信息
- */
- @Test
- public void test1() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- Customer customer = new Customer();
- customer.setCust_name("xdzy");
- LinkMan linkMan = new LinkMan();
- linkMan.setLkm_name("张三");
- LinkMan linkMan2 = new LinkMan();
- linkMan2.setLkm_name("李四");
- customer.getLinkMens().add(linkMan);
- customer.getLinkMens().add(linkMan2);
- linkMan.setCustomer(customer);
- linkMan2.setCustomer(customer);
- session.save(customer);
- session.save(linkMan);
- session.save(linkMan2);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- /**
- * 为客户添加联系人
- */
- @Test
- public void test2() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- Customer customer = session.get(Customer.class, 1L);
- LinkMan linkMan = new LinkMan();
- linkMan.setLkm_name("王五");
- customer.getLinkMens().add(linkMan);
- linkMan.setCustomer(customer);
- session.save(linkMan);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- /**
- * 为客户移除联系人
- */
- @Test
- public void test3() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- Customer customer = session.get(Customer.class, 1L);
- LinkMan linkMan = session.get(LinkMan.class, 3L);
- customer.getLinkMens().remove(linkMan);
- linkMan.setCustomer(null);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- }
- package com.hibernate.onetomany;
- import com.hibernate.domain.Customer;
- import com.hibernate.utils.HibernateUtils;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
- /**
- * @author: XDZY
- * @date: 2018/11/19 8:05
- * @description: 测试级联操作
- */
- public class Demo02 {
- /**
- * 删除用户时级联删除联系人;cascade:delete
- */
- @Test
- public void test1() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- Customer customer = session.get(Customer.class, 1L);
- session.delete(customer);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- }
测试多得多
- package com.hibernate.manytomany;
- import com.hibernate.domain.Role;
- import com.hibernate.domain.User;
- import com.hibernate.utils.HibernateUtils;
- import org.hibernate.Session;
- import org.hibernate.Transaction;
- import org.junit.Test;
- /**
- * @author: XDZY
- * @date: 2018/11/19 10:15
- * @description: 测试多得多操作
- */
- public class Demo01 {
- /**
- * 添加员工以及员工的职位
- */
- @Test
- public void test1() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- User user = new User();
- user.setUser_name("xdzy");
- User user1 = new User();
- user1.setUser_name("张三");
- Role role = new Role();
- role.setRole_name("学生");
- Role role1 = new Role();
- role1.setRole_name("老师");
- user.getRoles().add(role);
- user.getRoles().add(role1);
- user1.getRoles().add(role);
- user1.getRoles().add(role1);
- role.getUsers().add(user);
- role.getUsers().add(user1);
- role1.getUsers().add(user);
- role1.getUsers().add(user1);
- session.save(user);
- session.save(user1);
- session.save(role);
- session.save(role1);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- /**
- * 为员工添加一个职位
- */
- @Test
- public void test2() {
- //获取session
- Session session = HibernateUtils.openSession();
- //开启事务
- Transaction transaction = session.beginTransaction();
- /********************* 数据库操作 **********************/
- User user = session.get(User.class, 1L);
- Role role = new Role();
- role.setRole_name("班主任");
- user.getRoles().add(role);
- session.save(user);
- /*******************************************************/
- //提交事务
- transaction.commit();
- //关闭资源
- session.close();
- }
- }
Hibernate进阶学习3的更多相关文章
- Hibernate进阶学习4
Hibernate进阶学习4 深入学习hibernate的查询语句 测试HQL查询 package com.hibernate.test; import com.hibernate.domain.Cu ...
- 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)
[SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...
- Hibernate基础学习2
Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...
- PHP程序员进阶学习书籍参考指南
PHP程序员进阶学习书籍参考指南 @heiyeluren lastmodify: 2016/2/18 [初阶](基础知识及入门) 01. <PHP与MySQL程序设计(第4版)> ...
- Matlab 进阶学习记录
最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal = proposal_config('image_means', ...
- (Hibernate进阶)Hibernate系列——总结篇(九)
这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...
- zuul进阶学习(二)
1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改
ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...
- Struts2进阶学习4
Struts2进阶学习4 自定义拦截器的使用 核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <! ...
随机推荐
- windows下端口转发 netsh
添加映射表: netsh interface portproxy add v4tov4 listenport=(监听端口) connectaddress=(虚机IP) connectport=(虚机端 ...
- JNI:在线程或信号处理函数中访问自定义类
在写一个Tomcat应用,类需要被信号处理函数回调,可是在单独的程序中测试没用问题: void OnSingalHandler(int sig) { ... JNIEnv* env=NULL; if ...
- powerdesigner低版本打开高版本方式为只读导致无法保存PD只读read-only-mode
由于版本号不一致 打开PD文件后提示: 点击[确定]后打开,点击[取消]后打不开 但打开后修改完毕保存提示: 解决办法: pdm文件实际上是个xml文件,直接用文本编辑器打开该文件修改版本号即可 把根 ...
- html和Url转码与解码
JS (JQuery)对Html.URL的编码与解码 首先引入JQuery文件 1.js对Html编码 function htmlEncode(value){ return $('<div/&g ...
- [转]Linq语法一
LINQ即语言集成查询,是.NET Framework 3.5中新增的功能.其功能类似于数据库中的SQL语句(实际上LINQ就是针对.NET Framework的SQL):提供标准的.易于学习的查询和 ...
- SpingCloud微服务架构学习(一)之服务提供者与服务消费者
微服务构建的是分布式系统,各个微服务之间通过网络进行服务调用,这就有了服务提供者(被调用方)和服务消费者(调用方),以电影售票系统为例,假设服务调用关系如下图所示: 围绕此场景,我们先编写一个用户微服 ...
- better-scroll 遇到的问题 1
备注:better-scroll 实现下拉,是父子层的结构,父层的第一个子元素,如果超出父容器,那么就可以实现下拉 问题: 今天在使用better-scroll实现下拉功能,遇到了一个问题 &quo ...
- Linux 学习 之 bash
Anything is programmable with defined syntax and common lib. Bash Shell is created to programme to L ...
- c#和c++的运算符优先级
闲来无聊乱写代码.发现基础的东西有的时候也非常的抽象.不信?那来看看下面这条语句: ; ; j = i = -i++; 如果上述代码是vc++代码,那么输出结果是: i=- j=- 请按任意键继续. ...
- Azure 本月最新活动,速度Mark!
很多时候,为了知晓 Azure 相关活动的信息,需要到处查阅.问朋友同事,这样既麻烦又易造成延误.为方便广大粉丝,我们推出每月活动合集,帮您第一时间了解 Azure 最新活动,还等什么,一起来看吧! ...