一、前言

前面我们已经学过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入门(二)——一对多的映射关系的更多相关文章

  1. docker入门(二)容器与镜像的关系

    [编者的话]本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(co ...

  2. MyBatis 中一对一和一对多的映射关系

    1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...

  3. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  4. Hibernate4.x之入门篇

    Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...

  5. 爬虫入门二 beautifulsoup

    title: 爬虫入门二 beautifulsoup date: 2020-03-12 14:43:00 categories: python tags: crawler 使用beautifulsou ...

  6. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  7. 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示

    前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...

  8. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  9. Thinkphp入门 二 —空操作、空模块、模块分组、前置操作、后置操作、跨模块调用(46)

    原文:Thinkphp入门 二 -空操作.空模块.模块分组.前置操作.后置操作.跨模块调用(46) [空操作处理] 看下列图: 实际情况:我们的User控制器没有hello()这个方法 一个对象去访问 ...

随机推荐

  1. Nlog配置实例

      彩色Console target <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns= ...

  2. wp已死,metro是罪魁祸首!

    1.这篇文章肯定会有类似这样的评论:“我就是喜欢wp,我就是喜欢metro,我就是软粉“等类似的信仰论者发表的评论. 2.2014年我写过一篇文章,windows phone如何才能在中国翻身? 我现 ...

  3. ASP.NET Web API Model-ActionBinding

    ASP.NET Web API Model-ActionBinding 前言 前面的几个篇幅把Model部分的知识点划分成一个个的模块来讲解,而在控制器执行过程中分为好多个过程,对于控制器执行过程(一 ...

  4. 非阻塞/异步(epoll) openssl

    前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...

  5. AngularJS_01之基础概述、设计原则及MVC设计模式

    1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...

  6. python多行字符串

    Python中如何处理长代码格式化问题,如何提高格式化输出的长字符串的可读性? 当我们需要格式化输出一个很长的字符串的时候,都写在一行显得很难看,而且可读性也很差:当我们使用链式的语法写代码的时候常常 ...

  7. SQL Server 批量主分区备份(Multiple Jobs)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 案例分析(Case) 方案一(Solution One) 方案二(Solution Two) ...

  8. 搭建自己的Nuget服务器

    序言 你们公司有没有好多项目,有没有好多类库,你们的类库是在tfs中管理,还是svn或者github,又或者是各自为政版本类库随意使用? 那么你们使用者写类库的时候方便吗? 有没有更新下载,版本不一致 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(57)-插件---ueditor使用

    系列目录 目录: 前言 开发环境 知识点 初始使用 自定义工具栏 设置和读取编辑器内容 文件上传 ueditor加水印 ---------------------------------------- ...

  10. jQuery的DOM操作实例(3)——创建节点&&编写一个弹窗

    一.原生JavaScript编写弹窗 二.jQuery编写弹窗 知识点归纳总结: 在原生JavaScript中,创建一个节点: var oDiv=document.createElement(&quo ...