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. vscode入门使用教程(页面调试)

    初次使用vscode时各种不适应,所有需要用到的功能貌似都需要单独安装插件才能用.这让很多初次使用vscode的朋友有点无所适从. 下面本人就带各位朋友学习下如何使用vscode来进行最基本的工作—— ...

  2. C语言--线性表

    #include<stdio.h>#include<stdlib.h>#include<string.h>#define LIST_SIZE 100#define ...

  3. C#泛型集合之——队列与堆栈

    队列与堆栈基础 队列 1.操作: (1)创建及初始化: Queue<类型> 队列名 =new Queue<类型>()://空队列,无元素 Queue<类型> 队列名 ...

  4. 复杂dic的文件化存储和读取问题

    今天遇到一个难题.整出一个复杂的dic,里面不仅维度多,还含有numpy.array.超级复杂.过程中希望能够存储一下,万一服务器停了呢?万一断电了呢? 结果存好存,取出来可就不是那样了.网上搜索了很 ...

  5. A Deep Dive Into Draggable and DragTarget in Flutter

    https://medium.com/flutter-community/a-deep-dive-into-draggable-and-dragtarget-in-flutter-487919f6f1 ...

  6. 不安全的验证码Insecure CAPTCHA

    没啥好讲的,当验证不合格时,通过burp抓包工具修改成符合要求的数据包.修改参数标志位.USER-AGENT之类的参数. 防御 加强验证,Anti-CSRF token机制防御CSRF攻击,利用PDO ...

  7. 《区块链DAPP开发入门、代码实现、场景应用》笔记4——Ethereum Wallet中部署合约

    账号创建完成之后,账号余额是0,但是部署合约是需要消耗GAS的,因此需要获取一定的以太币才能够继续本次实现.在测试网中获取以太币可以通过挖矿的方式,在开发菜单中可以选择打开挖矿模式,但是这需要将Syn ...

  8. vue学习(1) vue-cli 项目搭建

    vue学习(1)  vue-cli 项目搭建 一.windows环境 1. 下载node.js安装包 官网:https://nodejs.org/en/download/ 选择LTS下载 2. 安装 ...

  9. POSIX 使用互斥量和条件变量实现生产者/消费者问题

    boost的mutex,condition_variable非常好用.但是在Linux上,boost实际上做的是对pthread_mutex_t 和pthread_cond_t的一系列的封装.因此通过 ...

  10. .net 获取CPU频率 内存 磁盘大小,域名 端口 虚拟目录等

    CPU个数: @Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS") CPU类型: @Environment.Get ...