Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠未正确保存数据库中的对象(?,,?,?)_Hibernate_Sqlite_Persistence - Fatal编程技术网

Hibernate 休眠未正确保存数据库中的对象(?,,?,?)

Hibernate 休眠未正确保存数据库中的对象(?,,?,?),hibernate,sqlite,persistence,Hibernate,Sqlite,Persistence,从问题开始。(我正在使用Hibernate 4。) 正如在其中一个答案中所建议的,我尝试使用反馈到反馈的方法 在我的RequestsController.java中,我有以下内容: @PostMapping("/feedback") public void postFeedback(@RequestBody FeedbackDto feedbackDto) { Feedback feedback = new Feedback(new Product(feedbackDto.getProd

从问题开始。(我正在使用Hibernate 4。)

正如在其中一个答案中所建议的,我尝试使用反馈到反馈的方法

在我的
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();
}
如果我试图打印
反馈的内容
反馈到
我得到了我所期望的,但是运行
保存()
刷新()
我没有在数据库中插入任何数据。为什么?

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

代码的问题在于产品构造函数的调用:

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
     }
}
然后你的方法应该是这样的:

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:(你能更好地解释一下这是怎么一个问题吗?我在这里解释了我为什么选择这种方法:我使用了以下方法而不是DAO:
Product Product=(Product)session.get(Product.class,feedbackDto.getProductId());
。因此,我正确地获得了相关产品(打印内容有效)。在创建
反馈时按您的建议传递对象
product
,并不能解决问题。:(在将
添加到
产品后,仍然采用相同的行为实现了可序列化
它起作用:)谢谢你的回答。即使不能完全解决我的问题,我也会接受的!