一、前言

前面我们已经学过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. swift 中关于open ,public ,fileprivate,private ,internal,修饰的说明

    关于 swift 中的open ,public ,fileprivate,private, internal的区别 以下按照修饰关键字的访问约束范围 从约束的限定范围大到小的排序进行说明 open,p ...

  2. Android 开发一定要看的15个实战项目

    前言: 虽说网上有太多的Android课程,但是大多都是视频,有Android在线开发环境的几乎没有,但是对于学习Android的人来说拥有在线的Android开发环境是非常好的,可以随时动手操作学习 ...

  3. mono for android 读取网络远程图片

    布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=& ...

  4. 让 ASP.NET vNext 在 Mac OS 中飞呀飞。。。

    写在前面 阅读目录: 娓娓道来 Install ASP.NET vNext Command Line Tools 安装 Homebrew 使用 Homebrew,安装 KVM Install Subl ...

  5. K-Means 聚类算法

    K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...

  6. Linux 中的数值计算和符号计算

    不知道经常需要做科学计算的朋友们有没有这样的好奇:在 Linux 系统下使用什么工具呢?说到科学计算,首先想到的肯定是 Matlab,如果再说到符号计算,那就非 Mathematica 不可了.可惜, ...

  7. 带进度条的文件批量上传插件uploadify

    有时项目中需要一个文件批量上传功能时,个人认为uploadify是快速简便的解决方案. 先上效果图: 一. 下载uploadify 从官网下载uploadify的Flash版本(Flash版本免费,另 ...

  8. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  9. 模拟实现Spring中的注解装配

    本文原创,地址为http://www.cnblogs.com/fengzheng/p/5037359.html 在Spring中,XML文件中的bean配置是实现Spring IOC的核心配置文件,在 ...

  10. mongodb全套配置

    1,下载&安装 MongoDB 提供了centos yum安装方式. 参考:http://docs.mongodb.org/manual/tutorial/install-mongodb-on ...