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 ...
随机推荐
- Django开发简单博客流程
什么是Django? Django是一个基于python的高级web开发框架 它能够让开发人员进行高效且快速的开发 高度集成(不用自己造轮子), 免费并且开源 当前路径创建工程 django-admi ...
- js 杂症,this with 变量提升
一.this.xx 和 xx 是两回事 受后端语言影响,总把this.xx 和xx 当中一回事,认为在function中,xx 就是this.xx,其实完全两回事: this.xx 是沿着this 原 ...
- 解决Ajax前台中文传到后台出现中文乱码
遇到的问题是: 前台利用Ajax, get方式向后台发送中文数据出现乱码. 解决办法是前台两次编码, 后台一次解码即可. 前台jsp文件 1 var text = "张三"; 3 ...
- 软件平台ThinkSNS+软件系统研发日记
NO.1: 实用开源软件安装部署是第一步, ThinkSNS+响应快速安装,易于二开基准,为大家录制了一份宝塔面板安装社交系统ThinkSNS+视频教程,点开观看视频一起吸一吸. 若无法播放,请直接打 ...
- 图说jdk1.8新特性(2)--- Lambda
简要说明 jdk常用函数式接口 Predicate @FunctionalInterface public interface Predicate<T> { boolean test(T ...
- SparkSQL之dataframe写入mysql报错
一.异常情况及解决方案 在使用Spark SQL的dataframe数据写入到相应的MySQL表中时,报错,错误信息如下: 代码的基本形式为: df.write.jdbc(url, result_ta ...
- 【Python】异常
捕获异常 try: num = int(input("请输入一个整数:")) result = 8 / num print(result) except ValueError: p ...
- Jenkins使用过程中注意事项
jenkins自动部署注意事项: 安装jenkins https://blog.csdn.net/qq_37372007/article/details/81586751 1.当提示错误ERROR: ...
- c++ 初始化静态static成员变量或static复合成员变量
https://stackoverflow.com/questions/185844/how-to-initialize-private-static-members-in-c https://sta ...
- centos7 ipython安装
##下载yum源(Centos 7 为例)[root@localhost ~]# wget http://mirror.centos.org/centos/7/extras/x86_64/Packag ...