Как связать две таблицы третьей? - PullRequest
0 голосов
/ 11 января 2019

У меня есть три таблицы:

1) книга: id (основной), имя

2) магазин: код (уникальный, не первичный), название

3) book_shop: book_id, shop_id (код), цена

Я хочу получить магазины в книге, как

book.getShop();

Как связать эту сущность?

Я пытался:

@Data
@NoArgsConstructor
@Entity
@Table(name = "book", schema = "example")
@EntityListeners(AuditingEntityListener.class)
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    @OneToMany(mappedBy = "book", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<BookShop> bookShop;
}

.

@Data
@NoArgsConstructor
@Entity
@Table(name = "shop", schema = "example")
@EntityListeners(AuditingEntityListener.class)
public class Shop {
    @Id
    private int code;

    private String name;

    @OneToMany(mappedBy = "shop", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<BookShop> bookShop;
}

.

@Data
@NoArgsConstructor
@Entity
@Table(name = "book_shop", schema = "example")
public class BookShop  implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Id
    @ManyToOne
    @JoinColumn(name = "book_id")
    private Book book;

    @Id
    @ManyToOne
    @JoinColumn(name = "shop_id")
    private Shop shop;

    @Column(name = "price")
    private int fromDate;
}

Этот код возвращает пустой набор: Book book = bookRepostiory.getById (1) .get (). GetBookShop ()

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Я бы предложил сначала - инициализировать набор в сущности

private Set<BookShop> bookShop = new HashSet<>();

Во-вторых, добавьте fetch = FetchType.EAGER к вашей ассоциации, например,

@OneToMany(fetch = FetchType.EAGER, mappedBy = "book", cascade = CascadeType.ALL)
0 голосов
/ 11 января 2019

Попробуйте использовать картографический инструмент "многие ко многим", как показано ниже, удалите таблицу book_shop,

добавить этот код в магазин,

  @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
  @JoinTable(name = "book_shop",
      joinColumns = {@JoinColumn(name = "book_id", nullable = false)},
      inverseJoinColumns = {@JoinColumn(name = "shop_id", nullable = false)})
  private Set<Book> bookList = null;

добавить этот код к объекту книги,

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, 
mappedBy ="bookList")
    private Set<Shop> shopList=null;

если возникнут проблемы сообщите !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...