java.sql.SQLIntegrityConstraintViolationException: столбец 'library_idlibrary' не может быть пустым - PullRequest
0 голосов
/ 17 февраля 2019

Я устанавливаю отношения один ко многим в спящем режиме, но когда я пытаюсь вставить значение в таблицы, я получаю исключение, что мой объект FK в фотографиях не может быть нулевым.

Моя родительская сущность:

@Table(name = "library")
@Entity
public class Book {
@OneToMany(
        fetch = FetchType.LAZY,
        mappedBy = "book",
        cascade = CascadeType.ALL,
        orphanRemoval = true
)
// setters / getters and other columns 

Моя дочерняя сущность

@Entity
@Table(name = "photos")
public class photos{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "idphotos")
private int id;


@ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "library_idlibrary")
private Book book;
// other columns 

Исключение:

java.sql.SQLIntegrityConstraintViolationException: Column 'library_idlibrary' cannot be null
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:115)
com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:960)
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1116)
com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1066)

У меня есть объект DAO и контроллер, которыевставка значений:

Контроллер:

  @PostMapping( value = "/newBook",consumes = {MediaType.MULTIPART_FORM_DATA_VALUE})
public String add(@ModelAttribute("book") @Valid Book book, HttpServletResponse response, HttpServletRequest request,@RequestParam(value = "photo", required = false) List<MultipartFile> photos, @RequestParam(value = "valute",required = false) String valute,BindingResult result) {
    if (result.hasErrors()) {
        return "addBook";}

    List<entity.photos> list = new ArrayList<>();
    for (MultipartFile photo : photos) {
        File file =null;
        if (!photo.isEmpty()) {
            try {
                validateImg(photo);
                file = new File(context.getRealPath("/uploadFile/" + photo.getOriginalFilename()));
                Logger.getAnonymousLogger().info("THE PATH IS " + file.getAbsolutePath());
                FileUtils.copyInputStreamToFile(photo.getInputStream(), file);
                file.createNewFile();
            } catch (IOException ex) {
                result.reject("uk_UA", "Поганий тип");
                return "addBook";
            }
        }
        if (file != null) {
            photos ph = new photos(photo.getOriginalFilename());
            StringBuilder builder = new StringBuilder();
            builder.append(file.getAbsolutePath());
            Logger.getAnonymousLogger().info("SOMETHING HAS BROKEN IN LOGGING FILE");
            System.out.println("INSIDE ADD METHOD ");
            list.add(ph);

        } else list.add(new photos(""));
    }
    book.getPhotosList().addAll(list);
    service.add(book);

    return "redirect:/books";
}

DAO:

   public void add(Book user) {
        currentSession().save(user);
}

1 Ответ

0 голосов
/ 17 февраля 2019

Скорее всего, вы не установили обратную ссылку из Фото в Книгу, а затем каскадно выполняете операцию сохранения / объединения из Книги через коллекцию фотографий.Когда вы добавляете элемент в коллекцию, вам нужно поддерживать обе стороны отношений.Например:

Book book = new Book();
Photo photo = new Photo();
book.addPhoto(photo);
photo.setBook(book);
//notice on the line above we set the backreference of the photo to the book.
hibernateSession.persist(book);
// now it is cascading from book to photo and it will set the foreign keys correctly.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...