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()这个方法 一个对象去访问 ...
随机推荐
- 星浩资本快速发展引擎:IT就是生产力
星浩资本成立于2010年,是一家涵盖私募基金.开发管理.商业与现代服务业三大业务范围的综合性管理公司,专注于投资中国首创.高成长性.高回报率的创新型城市综合体. 年轻的星浩资本在商业投资上有其独到的商 ...
- Android 添加ActionBar Buttons
一.在res/menu文件夹下创建Xml文件 跟标签为menu,设置item <?xml version="1.0" encoding="utf-8"?& ...
- SQLServer如何添加try catch
在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...
- Configure a VLAN (on top of a bond) with NetworkManager (nmcli) in RHEL7
not on top of a bond Environment Red Hat Enterprise Linux 7 NetworkManager Issue Need an 802.1q VLAN ...
- 分享阿里云推荐码 IC1L2A,购买服务器可以直接打9折,另附阿里云服务器部署ASP.NET MVC5关键教程
阿里云推荐码为:IC1L2A 阿里云还是不错滴. 以windows server 2008 R2为例,介绍如何从全新的服务器部署MVC5 站点. 新购买的阿里云服务器是没有IIS的,要安装IIS: 控 ...
- MVVM大比拼之knockout.js源码精析
简介 本文主要对源码和内部机制做较深如的分析,基础部分请参阅官网文档. knockout.js (以下简称 ko )是最早将 MVVM 引入到前端的重要功臣之一.目前版本已更新到 3 .相比同类主要有 ...
- BoneCP 升级遇到的问题
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [c ...
- Web 存储
Web Storage 介绍 Web storage 是在web上存储数据的功能,这里的存储是针对客户端来说的. 具体说分为两种: seesionStorage 数据存储在 session 对象中.s ...
- 快速查找sql server中的存储过程和视图
select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_shipped ...
- ORA-12154:TNS:无法解析指定的连接标识符
问题:ORA-12154:TNS:无法解析指定的连接标识符 原因:没有配置tnsnames.ora文件 解决方案: 配置环境变量变量名:ORACLE_HOME 变量值:如:D:\Database\pr ...