Почему я должен вводить идентификатор (PK) - проблема с автоматической генерацией идентификатора - PullRequest
0 голосов
/ 20 ноября 2018

Я создаю метод сдачи книги в аренду.Это выглядит следующим образом:

@PostMapping("/book")
public void purchaseBook(@RequestParam("userID") int userID, @RequestParam("bookID") int bookID) {
    bookRentalService.rentBook(userID, bookID);
}

После ввода идентификатора пользователя и bookID книга, если она доступна, добавляется в BookRentalDB.

Отношения между таблицами, которые я сделал следующим образом: enter image description here

Объект проката :

package bookrental.model.book;

import bookrental.model.account.User;
import lombok.*;

import javax.persistence.*;

@Entity
@Getter
@Setter
@EqualsAndHashCode
@AllArgsConstructor
@NoArgsConstructor
public class BookRentals {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToOne
    private Book book;
    @OneToOne
    private User user;
}

У меня проблема с созданием объекта этой сущности (BookRentals) в Сервисе.Он должен содержать объект Book и объект User.Я создал конструкторы для этого объекта только с bookID для Book и userID для UserprepareBookToRent меня тоже просят указать идентификатор класса BookRentals.В таком случае я не могу создать объект этого.Разве это не должно генерироваться автоматически?Что я должен сделать, чтобы это работало.

package bookrental.service.book;

import bookrental.model.account.User;
import bookrental.model.book.Book;
import bookrental.model.book.BookRentals;
import bookrental.repository.book.BookRepository;
import bookrental.repository.book.BookRentalsRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BookRentalService {

    private final BookRepository bookRepository;
    private final BookRentalsRepository bookRentalsRepository;

    @Autowired
    public BookRentalService(BookRepository bookRepository, BookRentalsRepository bookRentalsRepository) {
        this.bookRepository = bookRepository;
        this.bookRentalsRepository = bookRentalsRepository;
    }

    public void rentBook(int userID, int bookID) {
        if (bookRepository.doesBookExistsWithGivenID(bookID)) {
            Book bookToRent = bookRepository.findOne(bookID);
            if (bookToRent.isAvailable()) {
                updateBookAvailabilityAndSaveToDb(bookToRent);
                BookRentals preparedBookToRent = prepareBookToRent(userID, bookID);
                bookRentalsRepository.save(preparedBookToRent);
            } else {
                throw new IllegalArgumentException("Book is no available");
            }
        }
        throw new IllegalArgumentException("Book does not exist!");
    }


    private BookRentals prepareBookToRent(int userID, int bookID) {
        return new BookRentals(new Book(bookID),new User(userID)); // here im asked to input ID, too
    }

    private void updateBookAvailabilityAndSaveToDb(Book bookToRent) {
        bookToRent.setAvailable(false);
        bookRepository.save(bookToRent);
    }
}

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.book.rental.piotrek</groupId>
    <artifactId>BookRental</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
    </parent>



    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.22</version>
        </dependency>
    </dependencies>

</project>

Staktrace

C:\Users\Admin\IdeaProjects\BookRental\src\main\java\bookrental\service\book\BookRentalService.java
Error:(39, 16) java: no suitable constructor found for BookRentals(bookrental.model.book.Book,bookrental.model.account.User)
    constructor bookrental.model.book.BookRentals.BookRentals(int,bookrental.model.book.Book,bookrental.model.account.User) is not applicable
      (actual and formal argument lists differ in length)
    constructor bookrental.model.book.BookRentals.BookRentals() is not applicable
      (actual and formal argument lists differ in length)

Как я уже говорил выше, вот оно:

enter image description here

1 Ответ

0 голосов
/ 20 ноября 2018

Вы не правы, вы создали все аргументы contstructor.У вас есть 3 атрибута.Это означает, что у вас есть все аргументы конструктора с 3 аргументами, а не 2.

Просто создайте собственный конструктор.

public BookRentals (Book book, User user) {
// logic
}

ps: почему невозможно исключить какой-либо параметр из всех аргументов: Java Lombok: пропуск одного поля в @AllArgsConstructor?

upd: в комментариях указано что-топсих.Так что, если вы получили один к одному, используйте аннотацию к сущности напрямую.Если у вас есть много ко многим, рассмотрите OneToMany, поскольку арендовать одну и ту же книгу несколькими пользователями нереально.

Обращайтесь к этому для оформления таблицы: Как реализовать один к одному, один к одномуотношения многие и многие ко многим при разработке таблиц?

...