hibernate的多对多
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&characterEncoding=UTF-8&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的多对多相关推荐
- java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除
hibernate执行多对多关联查询时,关联表数据被删除 本帖最后由 binbb521 于 2012-12-04 11:48:29 编辑 S2SH框架开发的网站,执行两个多对多关系的表查询时,关联两个 ...
- hibernate之多对多关联映射
hibernate之多对多关联映射 转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/06/06/1497589.html
- hibernate关联关系(多对多)
一.一对多自关联实例: 数据库表 t_hibernate_sys_tree_node: 实体类 TreeNode: package com.liuwenwu.four.entity;import ja ...
- hibernate annotation多对多中间表添加其他字段的第三种方法
本示例主要以学生(T_Student)和课程(T_Course)之间的多对多关系,中间表Score(分数),学生表和课程表是多对多关系,另外为他们的关系添加额外的字段---分数: T_Student类 ...
- Hibernate双向多对多关联
一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...
- hibernate中多对多关系映射时的xml文件
2019独角兽企业重金招聘Python工程师标准>>> <?xml version="1.0" encoding="UTF-8"?> ...
- hibernate之多对多映射操作中间表
1.需求 1.1 在一个网上商城里有订单表,商品表,那么一个订单内可以有多个商品,一个商品可以被多个订单拥有.订单与商品就形成了多对多的关系,那么我们如何将这个关系通过hibernate映射到数据库呢 ...
- Hibernate的多对多关联关系(单向和双向)
n-n(多对多)的关联关系必须通过连接表实现.下面以商品种类和商品之间的关系,即一个商品种类下面可以有多种商品,一种商品又可以属于多个商品种类,分别介绍单向的n-n关联关系和双向的n-n关联关系. 单 ...
- Hibernate annotation多对多配置
角色(用户组),用户多对多. 角色实体配置: private Set<TAuthUser> users;@ManyToMany@JoinTable(name="t_auth_us ...
最新文章
- SQL语句中拆分字段
- HDU4970 Killing Monsters dp
- Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
- Yii2 mongodb 扩展的where的条件增加大于 小于号
- C语言 指针和数组区别 - C语言零基础入门教程
- mysql中try的意思_java中try是什么意思
- 一台机器上安装两个tomcat
- 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
- [CODEVS 1036]商务旅行
- 解决方案-Visual Studio生成库(DLLLIB)以及如何调用
- Java使用IntelliJ IDEA创建控制台程序并通过JDBC连接到数据库
- uploadify文件上传以及预览
- 有意思的文章 - 语音相关 - list
- 冰汽朋克侦查机器人_寒霜朋克全系统解析攻略 冰汽时代全法典全科技详解
- LiveZilla 详细 配置 设置 (二) 安装 LiveZilla
- 绿色版软件 tomcat+eclipse的使用
- linux用vi使一个段落对齐,12.8 Linux下vi命令和shell学习
- java引入string类_Java基础教程——String类
- 《我是一只IT小小鸟》连载四
- 免费c语言程序设计题库app,2020知到APPC语言程序设计(青岛职业技术学院)答案搜题公众号...