一、前言

前面我们已经学过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. Android 在Android代码中执行命令行

    1.路径最好不要是自己拼写的路径/mnt/shell/emulated/0/wifidog.conf 最好是通过方法获取的路径,不然可能导致命令无效  (挂载点的原因) public static f ...

  2. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  3. 免费SSL证书 之Let’s Encrypt申请与部署(Windows Nginx)

    我着着皇帝的新衣,但是你看不见    有一颗愿意等待的心,说明你对未来充满希望.有一颗充满希望的心,那么等待又算什么.人就是在等待与希望中度过,我们永远要对未来充满信心! 读在最前面: 1.本文案例为 ...

  4. js月份,日期加一天

    js没有直接可以用的函数,所以只能自己写,其中需要涉及到每个月天数的判断,如果是2月份的话,还要涉及到闰年的判断 var addDate = { //日期,在原有日期基础上,增加days天数,默认增加 ...

  5. AutoMapper(五)

    返回总目录 Dynamic和ExpandoObject映射 AutoMapper不用任何配置就可以从dynamic(动态)对象映射或映射到dynamic对象. namespace FifthAutoM ...

  6. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  7. 当前端也拥有 Server 的能力

    今天看了不少文章,比较感兴趣的是 Cache API.它是浏览器 Request/Response 的缓存管理工具,其使用风格和运用场景让我瞬间联想到了 ServiceWorker 和 Fetch A ...

  8. 向Java技术进军

    前两天有个朋友要我帮忙写个打印机服务,要求能应用在.net .Dephi.和java程序上面.看了下需求不难也就串口操作,所以就在周未写了个Win32的动态库,对于一个曾经写MFC程序的.net程序员 ...

  9. Android消息处理机制(Handler、Looper、MessageQueue与Message)

    Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...

  10. C#中,双屏/两屏/三屏/多屏跳转判断

    之前伤脑筋写过一次在Web中,JS,ActiveXObject去读取显示器数量.分辨率去判断单双屏跳转. 那么在客户端中,用C#去读取硬件信息,更方便更容易! 思路参考代码: ) { //此显示器是否 ...