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&amp;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之多对多关系的更多相关文章

  1. 如何决解项目中hibernate中多对多关系中对象转换json死循环

    先写一下原因吧!我是写的SSH项目,在项目中我遇到的问题是把分页对象(也就是pageBean对象)转化为json数据,下面为代码: public class PageBean <T>{// ...

  2. 关于hibernate中多对多关系

    关于多对多关系 数据库:在使用多对多的关系时,我们能够使用复合主键.也能够不使用,直接引入外键相同能够实现. 在数据库中使用多对多关系时,须要一个中间表. 多对多关系中的数据库结构例如以下: 表:Or ...

  3. hibernate 中多对多关系对象集合的保存

    多对多关系映射和一对多关系映射开发步骤差不多, 例子如下:员工和项目之间的关系,一个员工可以参与多个项目:一个项目可以有多个开发人员参与.因此是多对多的关系. 1 分析数据表 1.1)员工表 CREA ...

  4. 【Hibernate】多对多关系的表达

    User.hbm.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate ...

  5. Hibernate的多对多关系

    1.表的关系: 分别有三个表:课程表.学生表.分数表.课程和学生的关系是多对多的,因为一个学生对应多个课程,而一个课程被多个学生选修.如果用一对多.多对一的观点来看待课程和学生的关系显然是不对的,因为 ...

  6. Hibernate双向多对多对象关系模型映射

    1 双向many-to-many 业务模型: 描述员工和项目 一个员工同时可以参与多个项目 一个项目中可以包含多个员工 分析:数据库的数据模型,通过中间关系表,建立两个one-to-many构成man ...

  7. Hibernate的多对多映射关系

    example: 老师(teacher)和学生(Student)就是一个多对多的关系吧?老师可以有多个学生,学生也可以由多个老师,那在Hibernate中多对多是怎样实现的呢?? 在Hibernate ...

  8. Hibernate的关联映射关系

    一:多对一 <many-to-one 1.name:当前类的属性名(关联映射的类) 2.column:属性多对应的类的对应的表的外键(连接条件) 3.class:属性所对应的类的权限定名 4.n ...

  9. 2.2、Hibernate用注解方式实现一对多、多对多关系

    一.一对多关系 1.在上一篇日志中用.xml配置文件项目基础上,再往lib目录先添加一个包-hibernate-jpa-2.0-api-1.0.0.Final.jar 2.新建一个com.st.bea ...

随机推荐

  1. Cascader 级联选择器hover选择效果

    官网例子 <div class="block"> <span class="demonstration">hover 触发子菜单< ...

  2. custom drawer

    import 'package:flutter/material.dart'; main() => runApp(MaterialApp( home: HomePage(), )); class ...

  3. 又一个js乱码的秘密alert放在js文件里中文乱码,可是放在HTML里显示中文就很好

    用文本文档打开你的js文件,文件-另存为,编码更改为UTF-8保存. 回复 | PFly | 园豆:94 (初学一级) | 2017-07-17 21:32 显示结果中文乱码 支持(0)反对(0)回复 ...

  4. oracle 数据库导入导出语句

    oracle的exp/imp命令用于实现对数据库的导出/导入操作;exp命令用于把数据从远程数据库服务器导到本地,生成.dmp文件;imp命令用于把本地的数据库.dmp文件从本地导入到远程的oracl ...

  5. 木马防杀 花指令 OllyDbg

    打开木马 入口地址 添加花指令 全0的地方,可以插入花指令 保存为可执行文件 随便选择几行,右击 保存文件

  6. Celery:First Steps

    参考文档:http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html#first-step ...

  7. 什么是SAP Intelligent Robitic Process Automation - iRPA

    所谓智慧企业,一个特征就是具备将复杂但低附加值的重复流程通过自动化的方式完成的能力.通过自动化,从而将宝贵的人力资源投入到更高附加值的工作中去,比如提供产品和服务的品质,提升用户体验.SAPGUI时代 ...

  8. 【快捷键】印象笔记Markdown快捷键

    新建 Markdown 笔记 CMD+D 粗体 CMD+B 斜体 CMD+I 删除线 CMD+S 分隔线 CMD+L 编号列表 CMD+Shift+O 项目符号列表 CMD+Shift+U 插入待办事 ...

  9. fastJSON的常用方法总结

    fastJSON的常用方法总结 fastJSON中常用的对象是JSON,JSONArray,JSONObject三个对象.常用的方法如对象转为JSON字符串,JSON字符串转为对象,JSON字符串转为 ...

  10. ubuntu 下 VNC Viewer 通过网线连接树莓派的网络设置

    1 本机环境 Ubuntu 19.10 Raspberry 3B+ (Raspbian.开启了 vnc 服务) 2 Ubuntu 网络设置 1. Identity 下选择 Mac Address(如: ...