Hibernate4.2.4入门(二)——一对多的映射关系
一、前言
前面我们已经学过hibernate的基础,学会增删改查简单的操作,然而我们数据库中存在着1对多,多对1,多对多的关系,hibernate又是基于ORM基础上的开源框架,可以让我们不用去编写SQL语句,它会自动生成,mybatis也是基于ORM基础上的开源框架,只不过需要我们编写sql语句,算是一个半自动的orm吧,今天讲解的主要是1对多的映射关系。
1.1、创建项目
这里使用到的是组和用户的关系,1个组可以有多个用户。Group和User(这里笔者说个题外话,注意注意:映射文件中table的名字一定不能是mysql的关键字,笔者就是使用了Group,一直报sql语法错误,后来才发现原来Group是关键字)
新建实体类:User.java
- package com.hibernate.one_manys;
- public class User {
- private int uid;
- private String uname;
- public int getUid() {
- return uid;
- }
- public void setUid(int uid) {
- this.uid = uid;
- }
- public String getUname() {
- return uname;
- }
- public void setUname(String uname) {
- this.uname = uname;
- }
- public User(String uname)
- {
- this.uname=uname;
- }
- }
User
新建实体类:Group.java,其中添加User的集合,表示一个组中存在多个用户,使用集合表示
- package com.hibernate.one_manys;
- import java.util.HashSet;
- import java.util.Set;
- public class Group {
- private int gid;
- private String gtitle;
- private Set<User> users = new HashSet<User>();
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- public int getGid() {
- return gid;
- }
- public void setGid(int gid) {
- this.gid = gid;
- }
- public String getGtitle() {
- return gtitle;
- }
- public void setGtitle(String gtitle) {
- this.gtitle = gtitle;
- }
- }
Group
新建User的配置文件:User.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.hibernate.one_manys.User" table="USER">
- <id name="uid" type="int">
- <column name="UID"></column>
- <generator class="native"></generator>
- </id>
- <property name="uname" column="UNAME"></property>
- </class>
- </hibernate-mapping>
新建Group的配置文件:Group.hbm.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <!-- 注意点:Group是mysql中的关键字,如果使用会报语句错误 -->
- <!-- native:根据底层数据库的能力选择identity, sequence 或者hilo中的一个。 -->
- <class name="com.hibernate.one_manys.Group" table="Groups">
- <id name="gid" type="int">
- <column name="GID"/>
- <generator class="native"/>
- </id>
- <property name="gtitle" type="java.lang.String">
- <column name="GTITLE"/>
- </property>
- <!-- cascade:级联操作
- all : 所有情况下均进行关联操作。
- none:所有情况下均不进行关联操作。这是默认值。
- save-update:在执行save/update/saveOrUpdate时进行关联操作。
- delete:在执行delete时进行关联操作
- -->
- <set name="users" table="User" cascade="delete">
- <!-- column:指明了在User表里有一个gid的列名,是指向Group表的外键 -->
- <key column="gid"/>
- <!-- 一对多的映射 -->
- <one-to-many class="com.hibernate.one_manys.User"/>
- </set>
- </class>
- </hibernate-mapping>
注意:这里使用到cascade级联操作,顾名思义,就是你执行增删改查的时候会触发另一张表,简单说来就是,当你主表执行删除时,从表也会随之删除。
接下来编写测试类:
- package com.hibernate.one_manys;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.service.ServiceRegistry;
- import org.hibernate.service.ServiceRegistryBuilder;
- /**
- * 简单的1对多的的数据关系,使用到的表有:Groups(注意点:Group是数据库中的关键字),User,其中Groups是一,User是多
- * 使用到的类:Group,User;配置文件:Group.xml,User.xml
- * 步骤:
- * 1、新建实体类Group和User
- * 2、新建映射文件Group.hbm.xml和User.hbm.xml
- * 3、在配置文件hibernate.cfg.xml配置文件中声明映射文件
- * 4、新建测试类测试功能模块
- * 注意点:
- * 1、在映射文件中定义映射的表不能是关键字,其中Group是关键字,所以一直报语法错误
- * */
- public class Test_1 {
- private static SessionFactory sessionfactory;
- private static Session session;
- public static void main(String[] args){
- //配置
- Configuration config = new Configuration().configure();
- //注册服务
- ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties())
- .buildServiceRegistry();
- //实例化sessionfactory工厂
- sessionfactory = config.buildSessionFactory(service);
- //打开一个session
- session = sessionfactory.openSession();
- //添加
- add();
- //查询
- sel();
- //修改
- //update();
- //删除
- del();
- }
- //添加语句
- public static void add(){
- Transaction transaction = session.beginTransaction();
- Group g = new Group();
- g.setGtitle("学生会");
- User u = new User("张三");
- User u1 = new User("李四");
- g.getUsers().add(u);
- g.getUsers().add(u1);
- //注意点:需要保存组的对象
- session.save(g);
- session.save(u);
- session.save(u1);
- transaction.commit();
- }
- //查询语句
- public static void sel(){
- Group g = (Group) session.get(Group.class, 1);
- System.out.println(g.getGtitle()+","+g.getUsers().size());
- for(User u: g.getUsers()){
- System.out.println(u.getUname());
- }
- }
- //修改语句
- public static void update(){
- Group g = (Group)session.get(Group.class,1);
- g.setGtitle("技术会");
- for(User u : g.getUsers()){
- if(u.getUname().equals("张三")){
- u.setUname("陈凯辉");
- g.getUsers().add(u);
- }
- }
- Transaction transaction = session.beginTransaction();
- session.save(g);
- transaction.commit();
- }
- //删除语句
- //注意级联事件
- public static void del(){
- Group g = (Group)session.get(Group.class, 1);
- Transaction transaction = session.beginTransaction();
- session.delete(g);
- transaction.commit();
- }
- }
效果图为:
总结:
Hibernate4.2.4入门(二)——一对多的映射关系的更多相关文章
- docker入门(二)容器与镜像的关系
[编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...
- MyBatis 中一对一和一对多的映射关系
1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...
- Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...
- Hibernate4.x之入门篇
Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...
- 爬虫入门二 beautifulsoup
title: 爬虫入门二 beautifulsoup date: 2020-03-12 14:43:00 categories: python tags: crawler 使用beautifulsou ...
- mybatis入门_一对多,多对多映射以及整合spring框架
一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- Swift语法基础入门二(数组, 字典, 字符串)
Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...
- Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)
原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...
随机推荐
- 安卓GreenDao框架一些进阶用法整理
大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...
- 数据库 oracle数据库基本知识
sqlplus登录 普通用户登录 c:\>sqlplus 请输入用户名:scott 请输入口令: sqlplus scott/ quit退出 管理员登录 sqlplus /nolog 连接数据库 ...
- 从贝叶斯到粒子滤波——Round 1
粒子滤波确实是一个挺复杂的东西,从接触粒子滤波到现在半个多月,博主哦勒哇看了N多篇文章,查略了嗨多资料,很多内容都是看了又看,细细斟酌.今日,便在这里验证一下自己的修炼成果,请各位英雄好汉多多指教. ...
- 一步步开发自己的博客 .NET版(5、Lucenne.Net 和 必应站内搜索)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- ES6+ 现在就用系列(二):let 命令
系列目录 ES6+ 现在就用系列(一):为什么使用ES6+ ES6+ 现在就用系列(二):let 命令 ES6+ 现在就用系列(三):const 命令 ES6+ 现在就用系列(四):箭头函数 => ...
- 抛弃jQuery:DOM API之选择元素
原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...
- 自定义ActionBar标题与菜单中的文字样式
自定义标题文字样式 标题样式是ActionBar样式的一部分,所以要先定义ActionBar的样式 <style name="AppTheme" parent="A ...
- angular1
1.双向绑定: 可进可出 2.依赖注入 函数有定义方定义 3.MVC M: Model 模型--数据 V: View 视图--表现层 C: Controller 控制器--业务逻辑 4.模板: {{ ...
- Hyper-V1:创建和管理虚拟机
Hyper-V是微软的管理虚拟机(Virtual Machine)的服务,在安装Hyper-V功能之后,系统自动安装可视化的虚拟机管理工具:Hyper-V Manager.在同一台物理机上,能够使用H ...
- Dapper:The member of type SeoTKD cannot be used as a parameter Value
异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#dapper 上次说了一下Dapper的扩展Dapper.Contrib http://www. ...