Hibernate не правильно сохраняет объект в БД (?,?,?,?) - PullRequest
0 голосов
/ 14 февраля 2020

Исходя из этого вопроса. (Я использую Hibernate 4.)

Как предложено в одном из ответов, я попытался использовать подход FeedbackDto-Feedback.

Внутри моего RequestsController.java У меня есть это:

@PostMapping("/feedback")
public void postFeedback(@RequestBody FeedbackDto feedbackDto) {
    Feedback feedback = new Feedback(new Product(feedbackDto.getProductId()), feedbackDto.getScore(), feedbackDto.isPreferred(), feedbackDto.getTextNote());
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.save(feedback);
    session.flush();
    session.close();
}

Если я пытаюсь напечатать содержимое feedback и feedbackDto, я получаю то, что ожидал, но при выполнении save() и flush() я не получаю данных, вставленных в базу данных. Почему?

Вывод из hibernate:

Hibernate: 
    insert 
    into
        feedback
        (preferred, score, textnote, product) 
    values
        (?, ?, ?, ?)

Вот оператор create, который я использовал для создания таблицы обратной связи:

CREATE TABLE feedback(
  product INTEGER PRIMARY KEY,
  score NUMERIC,
  preferred INTEGER,
  textnote VARCHAR(255),
  FOREIGN KEY(product) REFERENCES product(id)
)

1 Ответ

1 голос
/ 14 февраля 2020

Проблема с вашим кодом заключается в вызове конструктора продукта:

new Product(feedbackDto.getProductId())

Сначала вы должны найти объект продукта из базы данных (или создать его, если его не существует, и достаточно идентификатора продукта). создать его).

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

Так что это должно быть примерно так:

CREATE TABLE feedback(
  feedbackid INTEGER PRIMARY KEY,
  score NUMERIC,
  preferred INTEGER,
  textnote VARCHAR(255),
  productid INTEGER
  FOREIGN KEY(productid) REFERENCES product(id)
)

И тогда ваш метод должен быть таким:

@PostMapping("/feedback")
public void postFeedback(@RequestBody FeedbackDto feedbackDto) {
    // I assume you have a field productDao in your class
    Product product = productDao.findById(feedbackDto.getProductId());
    if (product != null) {
        // Assuming the product should exists
        Feedback feedback = new Feedback(feedbackDto.getProductId()), feedbackDto.getScore(), feedbackDto.isPreferred(), feedbackDto.getTextNote(), product);
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.save(feedback);
        session.flush();
        session.close();
     } else {
        // return an error code
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...