spring-data-jpa 我想从图书馆(一个)实体中搜索图书(多个)实体,(A->B,B->A)

vaj7vani  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(158)

当我试图从“book”中搜索“nice_library”时,它运行得非常好。我猜是因为nice_library FK保存在书中。

book = bookRepository.findById(book.getId()).orElseThrow(() -> new RuntimeException());
Long id = book.getNiceLibrary().getId();
assertEquals(id, niceLibrary.getId());

但是当我试图从“nice_library”中搜索“book”时却什么都找不到。我猜是因为nice_library没有book的FK

niceLibrary = niceLibraryRepository.findById(niceLibrary.getId()).orElseThrow(() -> new RuntimeException());
List<Book> books = niceLibrary.getBooks(); // WHAT THE

我希望将“Book.id“保存在“nice_library”表中,以便从“nice_library”搜索到“book”。
Book.java

package com.example.jpa;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;

@Getter
@Entity
public class Book {
    @Id
    @GeneratedValue
    @Column
    private Long id;

    @Setter
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "LIBRARY_ID") // Foreign Key
    private NiceLibrary niceLibrary;
}

NiceLibrary.java

package com.example.jpa;

import lombok.Getter;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Getter
@Entity
public class NiceLibrary {
    @Id
    @GeneratedValue
    @Column
    private Long id;

    @OneToMany(mappedBy = "niceLibrary")
    private List<Book> books = new ArrayList<>();
}

一种图书桌

id|library_id|
--+----------+
77|        78|

nice_库

id|
--+
78|

测试代码

@SpringBootTest
class BookServiceTest {
    @Autowired
    private BookRepository bookRepository;
    @Autowired
    private NiceLibraryRepository niceLibraryRepository;

    @Test
    public void book() {
        Book book = new Book();
        NiceLibrary niceLibrary = new NiceLibrary();

        niceLibrary.getBooks().add(book);
        book.setNiceLibrary(niceLibrary);
        bookRepository.save(book);

        book = bookRepository.findById(book.getId()).orElseThrow(() -> new RuntimeException());
        Long id = book.getNiceLibrary().getId();
        assertEquals(id, niceLibrary.getId());

        niceLibrary = niceLibraryRepository.findById(niceLibrary.getId()).orElseThrow(() -> new RuntimeException());
        List<Book> books = niceLibrary.getBooks(); // ???
    }

如何从nice_library搜索图书?

kkbh8khc

kkbh8khc1#

据我所知,你想从图书馆得到一本特定的书。
一对多关系是通过在book表中引用库来设置的。
没有理由将图书的id存储在library表中。
这就是设置一对多关系所需的全部内容,并且您已正确完成。

+-----------------+
| Book            |
+-----------------+
| id              |
| LIBRARY_ID (fk) |
+-----------------+

+------------+
| Library    |
+------------+
| id         |
+------------+

你描述这个问题的方式是,你期望一个图书馆只有一本书,大约和我的图书馆一样大。
在一对多关系中,一方(在本例中为library)将始终具有实体集合,而另一方(在本例中为book)将仅具有对单个实体的引用。

相关问题