首页 > 解决方案 > 如何通过第三个链接两个表?

问题描述

我有三张桌子:

1) book: id (primary), name

2) shop:代码(唯一的,不是主要的),名称

3) book_shop: book_id, shop_id (code), price

我想在书上找到商店

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()

标签: springspring-bootspring-data-jpa

解决方案


尝试多对多映射工具,如下所示删除您的 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;

如有问题请告知!!


推荐阅读