【问题标题】:Hibernate not correctly saving an Object in the db (?, ?, ?, ?)Hibernate 未正确将对象保存在数据库中(?,?,?,?)
【发布时间】:2020-02-14 14:04:44
【问题描述】:

this 问题开始。 (我使用的是 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)
)

【问题讨论】:

    标签: hibernate sqlite persistence


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的评论!我仍然不明白为什么反馈应该有一个单独的 id :( 你能更好地解释一下这是怎么回事吗?我在这里解释了为什么我选择这种方法:stackoverflow.com/questions/60225542/…
    • 我没有使用 DAO,而是使用了以下内容:Product product = (Product) session.get(Product.class, feedbackDto.getProductId());。因此,我正确获得了相关产品(打印内容作品)。按照您的建议在创建feedback 时传递对象product 并不能解决问题。 :( 还是一样的行为
    • 在将implements Serializable 添加到Product 之后,它起作用了:) 感谢您的回答。即使它没有完全解决我的问题,我也会接受!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2019-10-30
    相关资源
    最近更新 更多