Spring Boot JPA中关联表的使用
2020/3/4 17:01:45
本文主要是介绍Spring Boot JPA中关联表的使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Spring Boot JPA中关联表的使用
本文中,我们会将会通过一个Book和Category的关联关系,来讲解如何在JPA中使用。
添加依赖
我们还是使用H2内存数据库来做测试:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> 复制代码
构建Entity
下面我们构建两个Entity:
@Data @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; @ManyToOne private Category category; } 复制代码
@Data @Entity public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "category", cascade = CascadeType.ALL) private List<Book> books; } 复制代码
上面我们定义了两个Entity,Category和Book是一对多的关系。我们通过@ManyToOne和@OneToMany来定义相应的关系。
构建Repository
我们接下来构建相应的Repository:
public interface BookRepository extends CrudRepository<Book, Long> { long deleteByTitle(String title); @Modifying @Query("delete from Book b where b.title=:title") void deleteBooks(@Param("title") String title); } 复制代码
public interface CategoryRepository extends CrudRepository<Category, Long> {} 复制代码
构建初始数据
为了方便测试,我们先构建需要的数据schema.sql和data.sql:
CREATE TABLE book ( id BIGINT NOT NULL AUTO_INCREMENT, title VARCHAR(128) NOT NULL, category_id BIGINT, PRIMARY KEY (id) ); CREATE TABLE category ( id BIGINT NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL, PRIMARY KEY (id) ); 复制代码
insert into book(id,title,category_id) values(1,'The Hobbit',1); insert into book(id,title,category_id) values(2,'The Rabbit',1); insert into category(id,name) values(1,'category'); 复制代码
测试
我们看一下怎么从Book中删除一条数据:
@Test public void whenDeleteByIdFromRepository_thenDeletingShouldBeSuccessful() { assertThat(bookRepository.count()).isEqualTo(2); bookRepository.deleteById(1L); assertThat(bookRepository.count()).isEqualTo(1); } 复制代码
再看一下category的删除:
@Test public void whenDeletingCategories_thenBooksShouldAlsoBeDeleted() { categoryRepository.deleteAll(); assertThat(bookRepository.count()).isEqualTo(0); assertThat(categoryRepository.count()).isEqualTo(0); } 复制代码
再看一下book的删除:
@Test public void whenDeletingBooks_thenCategoriesShouldAlsoBeDeleted() { bookRepository.deleteAll(); assertThat(bookRepository.count()).isEqualTo(0); assertThat(categoryRepository.count()).isEqualTo(1); } 复制代码
因为我们只在Category中指定了cascade = CascadeType.ALL, 所以删除category的时候可以删除相关联的Book,但是删除Book的时候不会删除相关联的category。
本文的例子可以参考github.com/ddean2009/l…
更多教程请参考 flydean的博客
这篇关于Spring Boot JPA中关联表的使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-26大厂数据结构与算法教程:入门级详解
- 2024-12-26大厂算法与数据结构教程:新手入门指南
- 2024-12-26Python编程入门指南
- 2024-12-26数据结构高级教程:新手入门及初级提升指南
- 2024-12-26并查集入门教程:从零开始学会并查集
- 2024-12-26大厂数据结构与算法入门指南
- 2024-12-26大厂算法与数据结构入门教程
- 2024-12-26二叉树入门教程:轻松掌握基础概念与操作
- 2024-12-26初学者指南:轻松掌握链表
- 2024-12-26平衡树入门教程:轻松理解与应用