hibernate中List一对多映射关系详解
场景:一个Team对一个多个Student,其中Team中的studes属性为List类型
直接上代码,测试通过的:
Team.java
- package com.fgh.hibernate;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * 一的一方
- * @author fgh
- *
- */
- @SuppressWarnings("unchecked")
- public class Team {
- private String id;
- private String name;
- private List students = new ArrayList();
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public List getStudents() {
- return students;
- }
- public void setStudents(List students) {
- this.students = students;
- }
- }
Studeng.java
- package com.fgh.hibernate;
- /**
- * 多的一方
- * @author fgh
- *
- */
- public class Student {
- private String id;
- private String cardId;
- private String name;
- private int age;
- private Team team;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getCardId() {
- return cardId;
- }
- public void setCardId(String cardId) {
- this.cardId = cardId;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Team getTeam() {
- return team;
- }
- public void setTeam(Team team) {
- this.team = team;
- }
- }
以下三个配置文件均放在src根目录下:
hibernate主配置文件:
hibernate.cfg.xml
- <?xml version='1.0' encoding='UTF-8'?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <!-- Generated by MyEclipse Hibernate Tools. -->
- <hibernate-configuration>
- <session-factory>
- <property name="connection.url">
- jdbc:mysql://localhost:3306/hibernate
- </property>
- <property name="connection.username">root</property>
- <property name="connection.password">root</property>
- <property name="connection.driver_class">
- com.mysql.jdbc.Driver
- </property>
- <property name="dialect">
- org.hibernate.dialect.MySQLDialect
- </property>
- <property name="show_sql">true</property>
- <!-- 引入两个相关配置文件 -->
- <mapping resource="Team.hbm.xml" />
- <mapping resource="Student.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
一方配置文件: Team.hbm.xml
- <?xml version="1.0"?>
- <!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.fgh.hibernate.Team" table="team_list">
- <!-- 采用uuid生成主键 这里要指定type为string类型 -->
- <id name="id" column="id" type="string">
- <generator class="uuid"></generator>
- </id>
- <!-- 像类似这样的name属性 都是指类里面的成员变量 column指数据库中对应的字段名-->
- <property name="name" column="name" type="string"></property>
- <!-- 设置级联为 cascade="all"-->
- <list name="students" table="student_list" cascade="all">
- <!-- 维护对方的外键 -->
- <key column="team_id"></key>
- <!-- index标签表示多的一方 对应一的一方的索引位置
- column属性表示数据库中存放数据的字段
- index为关键字 避免跟关键字冲突 使用`index` 或 [index]
- -->
- <index column="[index]" type="string"></index>
- <!-- 建立一对多的关联 -->
- <one-to-many class="com.fgh.hibernate.Student" />
- </list>
- </class>
- </hibernate-mapping>
多方配置文件 : Studeng.hbm.xml
- <?xml version="1.0"?>
- <!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.fgh.hibernate.Student" table="student_list">
- <id name="id" column="id" type="string">
- <generator class="uuid"></generator>
- </id>
- <property name="cardId" column="card_id" type="string"></property>
- <property name="name" column="name" type="string"></property>
- <property name="age" column="age" type="int"></property>
- <!-- 因为list中的value 不是原始类型 所以要指定其类型 -->
- <!-- 建立多对一关联映射关系 column="team_id"表示team这张表通过该字段
- 和student表关联 -->
- <many-to-one name="team" column="team_id"
- class="com.fgh.hibernate.Team">
- </many-to-one>
- </class>
- </hibernate-mapping>
根据以上三个配置文件,可以生成对应的数据库表,代码如下:
CreateTable.java
- package com.fgh.hibernate;
- import org.hibernate.cfg.Configuration;
- import org.hibernate.tool.hbm2ddl.SchemaExport;
- /**
- * 根据.hbm.xml配置文件创建相应的数据库表
- * @author fgh
- *
- */
- public class CreateTable {
- public static void main(String[] args) {
- SchemaExport export = new SchemaExport(new Configuration().configure());
- // 第一个参数表示是否在控制台打印出DDL语句(print the DDL to the console)
- // 第二个参数表示是否将脚本输出到数据库(export the script to the database)
- export.create(true, true);
- }
- }
运行CreateTable.java 生成对应表,后台打印sql如下:
- alter table student_list drop foreign key FKFEDE142211CB0B6A
- drop table if exists student_list
- drop table if exists team_list
- create table student_list (id varchar(255) not null, card_id varchar(255), name varchar(255), age integer, team_id varchar(255), `index` integer, primary key (id))
- create table team_list (id varchar(255) not null, name varchar(255), primary key (id))
- alter table student_list add index FKFEDE142211CB0B6A (team_id), add constraint FKFEDE142211CB0B6A foreign key (team_id) references team_list (id)
ok,表已经创建成功,下面测试保存操作:
InsertTest.java
- package com.fgh.hibernate;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.Transaction;
- import org.hibernate.cfg.Configuration;
- /**
- * 保存操作测试类
- * @author fgh
- *
- */
- public class InsertTest {
- private static SessionFactory sessionFactory;
- //创建工厂实例
- static {
- try {
- sessionFactory = new Configuration().configure()
- .buildSessionFactory();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @SuppressWarnings("unchecked")
- public static void main(String[] args) {
- Session session = sessionFactory.openSession();
- Transaction tx = null;
- try {
- //创建两个team
- Team team = new Team();
- team.setName("team1");
- Team team2 = new Team();
- team2.setName("team2");
- //创建6个student对象
- Student student = new Student();
- student.setAge(20);
- student.setName("zhangsan");
- student.setTeam(team);
- Student student2 = new Student();
- student2.setAge(24);
- student2.setName("lisi");
- student2.setTeam(team);
- Student student3 = new Student();
- student3.setAge(24);
- student3.setName("student3");
- student3.setTeam(team2);
- Student student4 = new Student();
- student4.setAge(24);
- student4.setName("student4");
- student4.setTeam(team2);
- Student student5 = new Student();
- student5.setAge(24);
- student5.setName("student5");
- student5.setTeam(team2);
- //前两个student属于team
- team.getStudents().add(student);
- team.getStudents().add(student2);
- //后三个student属于team2
- team2.getStudents().add(student3);
- team2.getStudents().add(student4);
- team2.getStudents().add(student5);
- //开启事务
- tx = session.beginTransaction();
- //保存team和team2
- session.save(team);
- session.save(team2);
- System.out.println("save success!");
- //提交事务
- tx.commit();
- } catch (Exception e) {
- e.printStackTrace();
- if (null != tx) {
- tx.rollback();
- }
- } finally {
- session.close();
- }
- }
- }
控制打印sql如下:
- save success!
- Hibernate: insert into team_list (name, id) values (?, ?)
- Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
- Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
- Hibernate: insert into team_list (name, id) values (?, ?)
- Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
- Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
- Hibernate: insert into student_list (card_id, name, age, team_id, id) values (?, ?, ?, ?, ?)
- Hibernate: update student_list set team_id=?, `index`=? where id=?
- Hibernate: update student_list set team_id=?, `index`=? where id=?
- Hibernate: update student_list set team_id=?, `index`=? where id=?
- Hibernate: update student_list set team_id=?, `index`=? where id=?
- Hibernate: update student_list set team_id=?, `index`=? where id=?
02-04插入的是team
05-08插入的是team2
09-13是对student_list表中外键team_id,和排序字段index的维护
student_list表中记录如下:
- id name age team_id
- 8a8adb7b34a45b700134a45b72130002 zhangsan 20 8a8adb7b34a45b700134a45b71fc00010
- 8a8adb7b34a45b700134a45b72130003 lisi 24 8a8adb7b34a45b700134a45b71fc00011
- 8a8adb7b34a45b700134a45b72130005 student3 24 8a8adb7b34a45b700134a45b721300040
- 8a8adb7b34a45b700134a45b72130006 student4 24 8a8adb7b34a45b700134a45b721300041
- 8a8adb7b34a45b700134a45b72140007 student5 24 8a8adb7b34a45b700134a45b721300042
team_list表中记录:
- 8a8adb7b34a467320134a46733cc0001 team1
- 8a8adb7b34a467320134a46733e40004 team2
hibernate中List一对多映射关系详解相关推荐
- UML 中的六大关系详解
UML中的六大关系 在UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation), ...
- Hibernate 中Criteria Query查询详解
当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中.此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询 ...
- one-many和many-one的关系中的inverse的详解
在one-many和many-one的关系中的inverse的详解. 1.现在假设有两个类Customer与Order,一个Customer可以有多个Order 2. 如果在Customer.hbm. ...
- Java中常见RuntimeException与其他异常表及Exception逻辑关系详解
Java中常见RuntimeException与其他异常表及Exception逻辑关系详解 前言 常见`RuntimeException` 其他错误类型 `Error`类 `Exception`类 E ...
- Hibernate配置文件与映射文件详解
Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...
- php中 继承中的概念,JavaScript_JavaScript中的继承方式详解,js继承的概念
js里常用的如下 - phpStudy...
JavaScript中的继承方式详解 js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于 ...
- java中的进制输出转换_Java I/O : Java中的进制详解
作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层. ...
- Java中的main()方法详解
源文作者:leizhimin 源文链接:http://lavasoft.blog.51cto.com/62575/53263 源文作者版权申明: 版权声明:原创作品,允许转载,转载时请务必以超链 ...
- UML类图与类的关系详解
UML类图与类的关系详解 2011-04-21 来源:网络 在画类图的时候,理清类和类之间的关系是重点.类的关系有泛化(Generalization).实现(Realization).依赖(D ...
最新文章
- 使用ganymed-ssh2-build通过ssh获得远程服务器参数
- 207. Course Schedule 课程表
- java做日历怎么对齐日期_如何使用Java日历从日期中减去X天?
- 话剧《白鹿原》:叫人乍舌,令人唏嘘,也让人捏把汗(图)
- hdu 2579 BFS
- 使用云原生应用和开源技术的创新攻略
- Eclipse快捷键生成语句
- 机器学习笔记十一之降维
- 狮子鱼社区团购独立版V15.3.0源码
- 在Blazor中构建数据库应用程序——第5部分——查看组件——UI中的CRUD列表操作
- SpringCloud实战2-Ribbon客户端负载均衡
- .htaccess文件玩转Rewrite
- PS 在PS中如何等比例放大缩小图片
- 怎样压缩图片到100k?如何把电脑图片缩小kb?
- 关于裁员几点看法及建议
- 寻找四叶草HTML5小游戏,寻找四叶草的作文四百字
- iphone13 Pro的运行内存是6gb
- 商贸零售行业2021年投资策略:市场下沉、渠道效率升级,新品牌新业态乘风而起
- Linux C/C++程序崩溃bug调试方法
- topcoder入门
热门文章
- 如何修改markdown中图片的大小
- C语言-动态创建二维数组
- 【错误记录】Groovy 函数参数动态类型报错 ( Caught: groovy.lang.MissingMethodException: No signature of method )
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 BroadcastReceiver 组件中调用 getApplication() 获取的 Application )
- 【错误记录】布局组件加载错误 ( Attempt to invoke virtual method ‘xxx$Callback android.view.Window.getCallback()‘ )
- 【错误记录】Android 应用安装报错 ( The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER )
- 【Netty】Netty 核心组件 ( Future | Channel | Selector | ChannelHandler )
- 使用Mybatis Generator自动生成代码
- 使用Filezilla Server配置FTP服务器
- 【软件构造】第三章第三节 抽象数据型(ADT)