1. 数据库的多对多

1.1 数据库中不能直接映射多对多
处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多

  注1:数据库多表联接查询永远就是二个表的联接查询A   B   C  Dt1   C  Dt2 Dt3注2:交叉连接注3:外连接:left(左)/right(右)/full(左右)主从表:连接条件不成立时,主表记录永远保留,与

2. hibernate的多对多

2.1 hibernate可以直接映射多对多关联关系(看作两个一对多)

多对多关系注意事项

3.1 一定要定义一个主控方

3.2 多对多删除
3.2.1 主控方直接删除
3.2.2 被控方先通过主控方解除多对多关系,再删除被控方com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a parent row: a foreign key constraint fails
3.2.3 禁用级联删除
3.3 关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护
org.hibernate.TransientObjectException: The given object has a null identifier: com.zking.hibernate06.entity.Book

null匹配

实体类

package entity;import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;public class Book  implements Serializable{private Integer bookId;private  String booName;Set<Book> books=new HashSet<Book>();public Set<Book> getBooks() {return books;
}
public void setBooks(Set<Book> books) {this.books = books;
}
private   float  price;Set<Category> categories=new HashSet<Category>();public Set<Category> getCategories() {return categories;
}
public void setCategories(Set<Category> categories) {this.categories = categories;
}
public Integer getBookId() {return bookId;
}
public void setBookId(Integer bookId) {this.bookId = bookId;
}
public String getBooName() {return booName;
}
public void setBooName(String booName) {this.booName = booName;
}
public float getPrice() {return price;
}
public void setPrice(float price) {this.price = price;
}
@Override
public String toString() {return "book [bookId=" + bookId + ", booName=" + booName + ", books=" + books + ", price=" + price + ", categories="+ categories + "]";
}}

Category

package entity;import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;public class Category  implements Serializable{private int category_id;private  String category_name;Set<Book> category=new HashSet<Book>();public int getCategory_id() {return category_id; }public void setCategory_id(int category_id) {this.category_id = category_id;}public String getCategory_name() {return category_name;}public void setCategory_name(String category_name) {this.category_name = category_name;}public Set<Book> getCategory() {return category;}public void setCategory(Set<Book> category) {this.category = category;}@Overridepublic String toString() {return "Category [category_id=" + category_id + ", category_name=" + category_name + ", category=" + category+ "]";}} 

bookdao

package dao;import org.hibernate.Session;
import org.hibernate.Transaction;import entity.Book;
import util.SessionFactoryUtils;public class Bookdao {public void addBook(Book book) {Session Session = SessionFactoryUtils.openSession();Transaction ts = Session.beginTransaction();Session.save(book);ts.commit();SessionFactoryUtils.closeSession();}
}

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.rong.entity4.Book" table="t_book_hb"><id name="bookId" type="java.lang.Integer" column="book_id"><generator class="increment"></generator></id><property name="bookName" type="java.lang.String" column="book_name"/><property name="price" type="java.lang.Float" column="price"/><!-- 多对多映射 --><!-- name:一方包含多方的属性对象名,指向多方cascade:级联操作 sava-update/none/delete/all=delete+save-updateinverse:是否是主控方,true表示对方是主控方,由对方维护中间表table:表示中間表名称--><set  name="categorys"cascade="save-update"inverse="false"table="t_book_category_hb"><!-- column:指向己方在中间表的外键字段 --><key column="bid"></key><!-- class:对方实体类路径column:对方在中间表的外键--><many-to-many class="entity.Category"column="cid"></many-to-many></set></class>
</hibernate-mapping>

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.rong.entity4.Category" table="t_category_hb"><id name="categoryId" type="java.lang.Integer" column="category_id"><generator class="increment"></generator></id><property name="categoryName" type="java.lang.String" column="category_name"/><!-- 多对多映射 --><set   name="books"cascade="save-update"inverse="true"table="t_book_category_hb"><key column="cid"></key><many-to-many class="entity.Book"column="bid"></many-to-many></set></class>
</hibernate-mapping>

bookdaoTest

package dao;import entity.Book;
import entity.Category;
import junit.framework.TestCase;public class BookdaoTest extends TestCase {Bookdao bookdao=new Bookdao();Book book=null;Category category=null;protected void setUp() throws Exception {book=new Book();}public void testAddBook() {book.setBooName("哼哼唧唧");book.setPrice(100f);Category  category=new Category();  category.setCategory_name("要等到1");Category  category1=new Category();  category1.setCategory_name("技术");    book.getCategories().add(category) ;book.getCategories().add(category1) ;category.getCategory().add(book);category1.getCategory().add(book);bookdao.addBook(book);}}

CategoryDaoTest

package com.dao;import com.entity.Book;
import com.entity.Category;import junit.framework.TestCase;public class CategoryDaoTest extends TestCase {CategoryDao categorydao = null;BookDao bookdao=new BookDao();protected void setUp() throws Exception {categorydao = new CategoryDao();}public void testGetCategoryById() {Book book = new Book();book.setBookName("是的");book.setPrice(240f);Category category = new Category();category.setCategoryId(2);Category c=categorydao.getCategoryById(category);book.getCategories().add(c);bookdao.addBook(book);}}

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><!-- 数据库相关配置 --><!-- 连接账户名 --><property name="connection.username">root</property><!-- 连接账户密码 --><property name="connection.password">123</property><!-- 连接的绝对路径 --><property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8&amp;userSSL=false</property><!-- 驱动的绝对路径 --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 数据库方言配置 --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- 调试相关配置 --><!-- hibernate运行过程是否展示自动生成的代码 --><property name="show_sql">true</property><!-- 是否规范输出SQL代码 --><property name="format_sql">true</property><!-- 实体映射相关配置 --><mapping resource="entity/Book.hbm.xml"/><mapping resource="entity/Category.hbm.xml"/></session-factory>
</hibernate-configuration>

hibernate的多对多相关推荐

  1. java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除

    hibernate执行多对多关联查询时,关联表数据被删除 本帖最后由 binbb521 于 2012-12-04 11:48:29 编辑 S2SH框架开发的网站,执行两个多对多关系的表查询时,关联两个 ...

  2. hibernate之多对多关联映射

    hibernate之多对多关联映射 转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/06/06/1497589.html

  3. hibernate关联关系(多对多)

    一.一对多自关联实例: 数据库表 t_hibernate_sys_tree_node: 实体类 TreeNode: package com.liuwenwu.four.entity;import ja ...

  4. hibernate annotation多对多中间表添加其他字段的第三种方法

    本示例主要以学生(T_Student)和课程(T_Course)之间的多对多关系,中间表Score(分数),学生表和课程表是多对多关系,另外为他们的关系添加额外的字段---分数: T_Student类 ...

  5. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...

  6. hibernate中多对多关系映射时的xml文件

    2019独角兽企业重金招聘Python工程师标准>>> <?xml version="1.0" encoding="UTF-8"?> ...

  7. hibernate之多对多映射操作中间表

    1.需求 1.1 在一个网上商城里有订单表,商品表,那么一个订单内可以有多个商品,一个商品可以被多个订单拥有.订单与商品就形成了多对多的关系,那么我们如何将这个关系通过hibernate映射到数据库呢 ...

  8. Hibernate的多对多关联关系(单向和双向)

    n-n(多对多)的关联关系必须通过连接表实现.下面以商品种类和商品之间的关系,即一个商品种类下面可以有多种商品,一种商品又可以属于多个商品种类,分别介绍单向的n-n关联关系和双向的n-n关联关系. 单 ...

  9. Hibernate annotation多对多配置

    角色(用户组),用户多对多. 角色实体配置: private Set<TAuthUser> users;@ManyToMany@JoinTable(name="t_auth_us ...

最新文章

  1. SQL语句中拆分字段
  2. HDU4970 Killing Monsters dp
  3. Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
  4. Yii2 mongodb 扩展的where的条件增加大于 小于号
  5. C语言 指针和数组区别 - C语言零基础入门教程
  6. mysql中try的意思_java中try是什么意思
  7. 一台机器上安装两个tomcat
  8. 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
  9. [CODEVS 1036]商务旅行
  10. 解决方案-Visual Studio生成库(DLLLIB)以及如何调用
  11. Java使用IntelliJ IDEA创建控制台程序并通过JDBC连接到数据库
  12. uploadify文件上传以及预览
  13. 有意思的文章 - 语音相关 - list
  14. 冰汽朋克侦查机器人_寒霜朋克全系统解析攻略 冰汽时代全法典全科技详解
  15. LiveZilla 详细 配置 设置 (二) 安装 LiveZilla
  16. 绿色版软件 tomcat+eclipse的使用
  17. linux用vi使一个段落对齐,12.8 Linux下vi命令和shell学习
  18. java引入string类_Java基础教程——String类
  19. 《我是一只IT小小鸟》连载四
  20. 免费c语言程序设计题库app,2020知到APPC语言程序设计(青岛职业技术学院)答案搜题公众号...

热门文章

  1. 基于DDPG、TD3的UR5装配仿真及其对比
  2. reader excelt to db
  3. JavaScript div跟随鼠标移动
  4. 支付宝2023集齐五福攻略技巧 五福卡全获取途径方法
  5. 关于计算机的未来想象作文,有关于未来生活的想象作文
  6. 历史风云大戏:大明王朝1566
  7. 非全研究生计算机网络-k8s网络插件(CNI)性能分析
  8. 钉钉网页版怎样适用于企业的个性化发展
  9. python打印hello_Python第一行代码——打印hello world
  10. 观周鸿祎先生访谈之后感