Как объединить 3 стола в один стол с JPA? - PullRequest
1 голос
/ 24 июня 2019

Я создаю API, в котором у меня есть 3 таблицы: «Пользователь», «Книга» и «Статус».И я хочу создать комбинированную таблицу User_Book_Status.Я не уверен, как реализовать это в JPA.Я думаю, что все таблицы имеют отношение M: N друг к другу.Как мне объединить эти 3 таблицы?

Вот мой дизайн базы данных.

https://i.imgur.com/33EBHeG.png

User.java

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    @Column(nullable = false)
    private String username;
    @Column(nullable = false)
    private String password;

    public User() {}
    //Getters and setters omitted.
}

Book.java

import javax.persistence.*;

@Entity
@Table(name = "books")
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;
    @Column(nullable = false)
    private String title;
    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private int pages;

    public Book() {}
    //Getters and setters omitted.
}

Status.java

import javax.persistence.*;


@Entity
public class Status {
    public enum ReadingStatus {READING,
                               FINISHED,
                               ONHOLD}
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    @Enumerated(EnumType.STRING)
    private ReadingStatus status;
}

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вот пример того, как реализовать уже работающее решение:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "user_book_status")
public class UserBookStatus {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;

  @ManyToOne
  @JoinColumn(name = "user_id")
  private User user;

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

  @ManyToOne
  @JoinColumn(name = "status_id")
  private Status status;
}

@ Таблица для указания имени таблицы, чтобы вы могли свободно изменять имя объекта.

@ ManyToOne означает, что у вас может быть много записей UserBookStatus для одного пользователя или книги или статуса.

@ JoinColumn используется для указания имени столбца в вашей сущности, который сопоставляется с @Id от сущности (Пользователь, Книга, Статус), на которую вы ссылаетесь.

0 голосов
/ 25 июня 2019

Мне кажется, что вам на самом деле не нужна сущность для Status. Я бы смоделировал это так:

@Entity
public class Loan {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @ManyToOne
    private Book book;

    @ManyToOne
    private User user;

    @Enumerated(EnumType.STRING)
    private ReadingStatus status;

    //...
 }

Кроме того, вы можете сделать отношения двунаправленными, чтобы у User и Book был список Loan с.

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