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()这个方法 一个对象去访问 ...
随机推荐
- SharePoint 2016 必备组件离线安装介绍
前言 SharePoint 必备组件安装,一直以来都是SharePoint安装过程中的最大的坑,尤其是不能联网的服务器.博主在这里简单介绍一下离线安装过程,并附组件包下载以及安装命令,并且在windo ...
- ORACLE从共享池删除指定SQL的执行计划
Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...
- python安装BeautifulSoup注意事项
好久没有写爬虫了,最近用Python的BeautifulSoup4.Scrapy分别对以前写的spider进行优化,发现python3.5后这些库变化了很多,遇到了许多问题,在这里做一下总结. 切换环 ...
- a标签绝对定位,点击区域被图片遮挡(IE下)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【腾讯Bugly干货分享】微信iOS SQLite源码优化实践
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57b58022433221be01499480 作者:张三华 前言 随着微信iO ...
- EasyPR--开发详解(5)颜色定位与偏斜扭转
本篇文章介绍EasyPR里新的定位功能:颜色定位与偏斜扭正.希望这篇文档可以帮助开发者与使用者更好的理解EasyPR的设计思想. 让我们先看一下示例图片,这幅图片中的车牌通过颜色的定位法进行定位并从偏 ...
- 我的“第一次”,就这样没了:DDD(领域驱动设计)理论结合实践
写在前面 插一句:本人超爱落网-<平凡的世界>这一期,分享给大家. 阅读目录: 关于DDD 前期分析 框架搭建 代码实现 开源-发布 后记 第一次听你,清风吹送,田野短笛:第一次看你,半弯 ...
- ABP源码分析四十四:ZERO的配置
ABP Zero模块中需要配置的地方主要集中在三块:配置静态的role,配置外部认证源,以及配置本地化语言和资源. UserManagementConfig/IUserManagementConfig ...
- java调用CXF WebService接口的两种方式
通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...
- 10最好用的Node.js工具、插件和资料库
每一个称职的程序员都应该拥有一套极好的工具来提高自己的工作效率.在Livecoding.tv 上,那里的程序员分享了10个他们认为是最好用的工具.插件和资料库.据说,以下的这10个工具是使用Node. ...