首页 > 解决方案 > 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();
}

如果我尝试打印的内容,feedbackfeedbackDto得到了我所期望的,但是运行save()并且flush()我没有在数据库中插入任何数据。为什么?

休眠的输出:

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)
)

标签: hibernatesqlitepersistence

解决方案


您的代码的问题是产品构造函数的调用:

new Product(feedbackDto.getProductId())

您应该首先从数据库中获取产品对象(如果不存在并且产品的 id 足以创建它,则创建它)。

另一个问题是您的数据库表示。您应该为反馈表的主键使用整数 ID,并使用另一个字段来记录外键。这是比混合 ID 和外键更好的方法。

所以这应该是这样的:

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
     }
}

推荐阅读