Hibernate 没有正确地在数据库中保存一个对象(?,?,?,?)

Hibernate not correctly saving an Object in the db (?, ?, ?, ?)

来自 问题。 (我正在使用 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
        (?, ?, ?, ?)

这是我用来创建反馈的创建语句 table:

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

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

new Product(feedbackDto.getProductId())

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

另一个问题是您的数据库表示。您应该使用一个整数 ID 作为您的反馈 table 主键,并有另一个字段来记录外键。这是比混合 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
     }
}