hibernate之多对多关系
hibernate的多对多
hibernate可以直接映射多对多关联关系(看作两个一对多)
下面我们拿三张表来做实例
t_book_hb

t_book_category_hb(桥接表)

t_category_hb

添加实体类及映射文件
Book
public class Book implements Serializable{
private Integer bookId;
private String bookName;
private Float price;
// 一对多:一本书对应多种书本类型
private Set<Category> categroies=new HashSet<Category>();
public Set<Category> getCategroies() {
return categroies;
}
public void setCategroies(Set<Category> categroies) {
this.categroies = categroies;
}
public Integer getBookId() {
return bookId;
}
public void setBookId(Integer bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public Float getPrice() {
return price;
}
public void setPrice(Float price) {
this.price = price;
}
public Book() {
super();
}
public Book(Integer bookId, String bookName, Float price) {
super();
this.bookId = bookId;
this.bookName = bookName;
this.price = price;
}
@Override
public String toString() {
return "Book [bookId=" + bookId + ", bookName=" + bookName + ", price=" + price + "]";
}
Book.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hmc.hibernate02.entity.Book" table="t_book_hb">
<id name="bookId" type="java.lang.Integer" column="book_id">
<!--native:identity(标识列)+sequence(序列) -->
<generator class="native"></generator>
</id>
<property name="bookName" type="java.lang.String" column="book_name"/>
<property name="price" type="java.lang.Float" column="price"/> <!--
select category_id,category_name,t_category_hb c,
t_book_category_hb bc where c.category_id=bc.cid
--> <!--建立关联关系 :一对多-->
<!--
name:实体类中定义的属性名,指向多方
cassade:用来控制如何操作关联的持久化对象的
save-update/delete/none/all
inverse:主控方
-->
<set name="categroies" cascade="save-update" inverse="true" table="t_book_category_hb" >
<!-- 对应中间表的外键列,指向一方 -->
<key column="bid"></key>
<!--指定实体之间的关联关系:一对多 -->
<!--多对多关联关系-->
<many-to-many class="com.hmc.hibernate02.entity.Category" column="cid"/>
</set>
</class> </hibernate-mapping>
Category
public class Category implements Serializable {
private Integer categoryId;
private String categoryName;
//一对多:一种书本类型对应多本书
private Set<Book> books=new HashSet<Book>();
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
public Integer getCategoryId() {
return categoryId;
}
public void setCategoryId(Integer categoryId) {
this.categoryId = categoryId;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
public Category() {
super();
}
@Override
public String toString() {
return "Category [categoryId=" + categoryId + ", categoryName=" + categoryName + ", books=" + books + "]";
}
Category.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.hmc.hibernate02.entity.Category" table="t_category_hb">
<id name="categoryId" type="java.lang.Integer" column="category_id">
<!--native:identity(标识列)+sequence(序列) -->
<generator class="native"></generator>
</id>
<property name="categoryName" type="java.lang.String" column="category_name"/> <!--一方中的主键就是多方中的外键 -->
<!--
select book_id,book_name,price from t_book_hb b,
t_book_category_hb bc,t_book b where b.book_id=bc.bid
and bc.bid=b.book_id --> <!--建立关联关系 :一对多-->
<!--
name:实体类中定义的属性名,指向多方
cassade:用来控制如何操作关联的持久化对象的
save-update/delete/none/all
inverse:主控方
-->
<set name="books" cascade="save-update" inverse="false" table="t_book_category_hb" >
<!-- 对应中间表的外键列,指向一方 -->
<key column="cid"></key>
<!--指定实体之间的关联关系:多对多 -->
<!--class:指向的是多方的实体类的全路径名 -->
<many-to-many class="com.hmc.hibernate02.entity.Book" column="bid"/>
</set>
</class> </hibernate-mapping>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--1.数据库相关 -->
<!--(connection.username|connection.password|connection.url|connection.driver_class|dialect) -->
<!--数据库账号 -->
<property name="connection.username">root</property>
<!--数据库密码 -->
<property name="connection.password">123</property>
<!--数据库连接的url -->
<!--特殊字符!!! 特殊字符!!! 特殊字符!!!-->
<property name="connection.url">
jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8
</property>
<!-- 数据库连接驱动 -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!--数据库方言 -->
<property name="dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!--2.调试相关 -->
<!--(show_sql|format_sql) -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!--3.实体映射相关 -->
<mapping resource="com/hmc/hibernate02/entity/Book.hbm.xml"/>
<mapping resource="com/hmc/hibernate02/entity/Category.hbm.xml"/> </session-factory>
</hibernate-configuration>
BookDao
public class BookDao {
public void addBook(Book book) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
//保存
session.save(book);
transaction.commit();
SessionFactoryUtils.closeSession();
}
public Book get(Book book) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
//保存
Book b = session.get(Book.class, book.getBookId());
if(b!=null) {
Hibernate.initialize(b.getCategroies());
}
transaction.commit();
SessionFactoryUtils.closeSession();
return b;
}
//被控方
public void delBook(Book book) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Book b = session.get(Book.class, book.getBookId());
if(null!=b) {
//解除关联关系
Set<Category> categroies = b.getCategroies();
for (Category category : categroies) {
b.getCategroies().remove(category);
}
session.delete(b);
}
transaction.commit();
SessionFactoryUtils.closeSession();
}
CategoryDao
public class CategoryDao {
public Category get(Category category) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
//保存
Category c = session.get(Category.class, category.getCategoryId());
if(c!=null) {
Hibernate.initialize(c.getBooks());
}
transaction.commit();
SessionFactoryUtils.closeSession();
return c;
}
//主控方
public void delCategory(Category c) {
Session session = SessionFactoryUtils.openSession();
Transaction transaction = session.beginTransaction();
Category category = session.get(Category.class, c.getCategoryId());
if(null!=category) {
//解除关联关系
Set<Book> books = c.getBooks();
for (Book book : books) {
//错误(删除当前书本对应的书)
//category.getBooks().remove(book);
//ok(删除当前书本对应的类型)
book.getCategroies().remove(category);
}
session.delete(category);
}
transaction.commit();
SessionFactoryUtils.closeSession();
}
BookDaoTest(测试类)











hibernate之多对多关系的更多相关文章
- 如何决解项目中hibernate中多对多关系中对象转换json死循环
先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...
- 关于hibernate中多对多关系
关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...
- hibernate 中多对多关系对象集合的保存
多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...
- 【Hibernate】多对多关系的表达
User.hbm.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate ...
- Hibernate的多对多关系
1.表的关系: 分别有三个表:课程表.学生表.分数表.课程和学生的关系是多对多的,因为一个学生对应多个课程,而一个课程被多个学生选修.如果用一对多.多对一的观点来看待课程和学生的关系显然是不对的,因为 ...
- Hibernate双向多对多对象关系模型映射
1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...
- Hibernate的多对多映射关系
example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...
- Hibernate的关联映射关系
一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...
- 2.2、Hibernate用注解方式实现一对多、多对多关系
一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...
随机推荐
- 深度学习-Wasserstein GAN论文理解笔记
GAN存在问题 训练困难,G和D多次尝试没有稳定性,Loss无法知道能否优化,生成样本单一,改进方案靠暴力尝试 WGAN GAN的Loss函数选择不合适,使模型容易面临梯度消失,梯度不稳定,优化目标不 ...
- ubuntu安装texlive2019
1.下载texlive2019的iso文件,清华镜像地址:https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/texliv ...
- mysql数据库的安装和连接测试并给root用户赋密码
一.mysql数据库的安装 Windows下MySQL的配置 以 MySQL 5.1 免安装版为例, 下载 mysql-noinstall-5.1.69-win32.zip ( 官方下载页: http ...
- java之spring之scope和autowiring
目录结构如下: UserDao.java package cn.sxt.dao; public interface UserDao { public void add(); } UserDaoImpl ...
- SpringBoot开发验证码功能
简介 验证码主要是用来防止恶意破解密码.刷票.论坛灌水.刷页.Kaptcha 是一个可高度配置的实用验证码生成工具,使用也很简单,这里就使用它来做验证码. 另外使用JAVA原生的API也可以实现验证码 ...
- 分页工具类PageResult
1.工具类 public class PageResult implements Serializable { private Long total;//总记录数 private List rows; ...
- linux入门—安装linux系统(1)
一,linux介绍 linux是一套免费使用和自由传播的类Unix操作系统,简单的说就是不要钱,你可以随便使用,也可以分享给其他人. (剩下的详细内容,个人认为百度百科的内容比我瞎讲强的多,网址:ht ...
- eyoucms 模板
https://www.oschina.net/p/eyoucms 下载模板 https://www.eyoucms.com/doc/operation/ 学习手册
- 面试总结之Data Science
数据科学家面试如何准备? https://mp.weixin.qq.com/s/uFJ58az8WRyaXT2nibK02g 2020 年算法 / 数据分析面试数学考点梳理 https://mp.we ...
- 反序列化之PHP原生类的利用
目录 基础知识 __call SoapClient __toString Error Exception 实例化任意类 正文 文章围绕着一个问题,如果在代码审计中有反序列化点,但是在原本的代码中找不到 ...