Есть ли способ вставить значение значения внешнего ключа из первичного ключа другой таблицы при отправке полезной нагрузки в почтальоне? - PullRequest
1 голос
/ 29 марта 2019

Author.java:

package com.abc.entity;    

@Data
@Entity
@Table(name="author")
public class Author {

    @Id
    @Column(nullable=false, name="id")
    @SequenceGenerator(sequenceName="author_seq", name="a_seq")
    @GeneratedValue(generator="a_seq", strategy=GenerationType.SEQUENCE)
    private Integer id;

    @Column(nullable=false, name="first_name")
    @NotBlank(message = "First Name is required")
    private String firstName;

    @Column(name="last_name")
    @NotNull(message = "Last Name is required")
    private String lastName;

    @Column(name = "email", unique = true)
    @NotNull(message="email cannot be null")
    @Email
    @Pattern(regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}")
    private String email;

    @NotNull(message="Password")
    @Size(min=8, max=16, message="Password must be >= 8 and <=16 ")
    private String password;

    @OneToMany(/*orphanRemoval = true,*/
            //mappedBy="author",
            cascade=CascadeType.ALL) 
    private List<Book> books = new ArrayList<Book>();



    /**
     * Adding a book and in turn setting it author to this object
     * @param book
     */
    public void addBook(Book book) {
        books.add(book);
        book.setAuthor(this);
    }

    /**
     * Removing a book from the author
     * @param book
     */
    public void removeBook(Book book) {
        books.remove(book);
        book.setAuthor(null);
    }
}

Book.java:

package com.abc.entity;

@Data
@Entity
@Table(name="book")
public class Book {
    @Id
    @Column(nullable=false, name="id")
    @SequenceGenerator(sequenceName="book_seq", name="b_seq")
    @GeneratedValue(generator="b_seq", strategy=GenerationType.SEQUENCE)
    private Long id;

    @Column(name="isbn")
    @NotNull(message = "isbn is required")
    //@Size(min=8, max=8, message="isbn must be = 8 numbers")
    private Long isbn;

    @Column(nullable=false, name="title")
    @NotNull(message = "Title is required")
    private String title;

    @Column(nullable=false, name="edition")
    @NotBlank(message = "Edition is required")
    private String edition;

    @Column(nullable=false, name="price")
    @NotNull(message = "Price is required")
    private Double price;

    @Column(nullable=false, name="date_published")
    @Pattern(regexp = "^(0[1-9]|1[0-2])([\\/])([1-9][0-9])$", message = "Must be formatted MM/YY")
    private String datePublished;

    //@ForeignKey(name="FK_COUNTRY")
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name="author_id")//, referencedColumnName="id")
    @OnDelete(action = OnDeleteAction.CASCADE)
    private Author author;
}

Я думаю, что столбец внешнего ключа вТаблица book будет вставлена ​​с первичным ключом таблицы author.

Однако null вставляется, если я удалил атрибут referencedColumnName, который указывает на первичный ключ автора.

Когда я добавляю атрибут referencedColumnName, у меня появляется ошибка, указывающаяnull нельзя вставить в столбец внешнего ключа таблицы book.

java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SPRING"."BOOK"."AUTHOR_ID")

Я создал две сущности.

  1. An Author (который может иметь / написать много книг) [OneToMany]
  2. A Book, который может принадлежать только одному автору [ManyToOne]

Когда я отправляю полезную нагрузку в Postman для проверки @PostMapping, который вставляет author, внешний ключ в таблице book (author_id), который должен ссылаться на первичный ключ author таблица (id) вставляется с null, а не со значением первичного ключа author.

Когда я добавляю referencedColumnName, выдается исключение, указывающее, что nullневозможно вставить в book.author_id.

Я пытался:

  1. с использованием @PrimaryKeyJoinColumn аннотации
  2. referencedColumnName атрибут

1 Ответ

0 голосов
/ 01 июля 2019

Мне удалось решить мою проблему, добавив две аннотации: JsonManageReference и JsonBackReference.

@ JsonManageReference на поле private Список книг внутри класса Author

и @JsonBackReference на поле private Автор автор внутри класса Book

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