Spring DATA JPA多对多
多对多关系在Spring DATA JPA中的实现需要以下步骤:
-
创建实体类:创建两个实体类,并使用@ManyToMany注解表示它们之间的多对多关系。
-
创建中间表:创建一个中间表,用于存储两个实体类之间的多对多关系。中间表需要包含两个实体类的主键作为外键。
-
使用@JoinTable注解:使用@JoinTable注解指定中间表的名称和外键列名。
-
使用@JoinColumn注解:使用@JoinColumn注解指定每个实体类的外键列名。
-
编写Repository接口:编写Repository接口,继承JpaRepository,并使用@Query注解实现多对多查询。
-
测试:编写测试用例,测试多对多查询的正确性。
下面是一个示例代码:
- 创建实体类
@Entity
public class Book {
@Id
private Long id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_author",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set<Author> authors;
}
@Entity
public class Author {
@Id
private Long id;
private String name;
@ManyToMany(mappedBy = "authors")
private Set<Book> books;
}
- 创建中间表
CREATE TABLE book_author (
book_id BIGINT NOT NULL,
author_id BIGINT NOT NULL,
PRIMARY KEY(book_id, author_id),
FOREIGN KEY(book_id) REFERENCES book(id),
FOREIGN KEY(author_id) REFERENCES author(id)
);
- 使用@JoinTable注解
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "book_author",
joinColumns = @JoinColumn(name = "book_id"),
inverseJoinColumns = @JoinColumn(name = "author_id"))
private Set<Author> authors;
- 使用@JoinColumn注解
@ManyToMany(mappedBy = "authors")
private Set<Book> books;
- 编写Repository接口
public interface BookRepository extends JpaRepository<Book, Long> {
@Query("SELECT b FROM Book b JOIN b.authors a WHERE a.name = :name")
List<Book> findByAuthorName(@Param("name") String name);
}
- 测试
@Test
public void testFindByAuthorName() {
List<Book> books = bookRepository.findByAuthorName("John Smith");
assertEquals(2, books.size());
}
原文地址: https://www.cveoy.top/t/topic/rZW 著作权归作者所有。请勿转载和采集!