hibernate - 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:
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
}
}
推荐阅读
- ios - 是否可以在 dart/flutter 项目的编译时获取当前时间?
- java - onClickListeners 之间的变量重置为默认值
- python - 是否可以使用“LIKE”和 SqlAlchemy 在 JSONB 列表中搜索值?
- php - 带if语句的php代码说明
- python - Pytorch 和 numpy 广播规则的区别?
- regex - 如果输入的前 3 个字符的值为“xyz”,如何禁用提交按钮并显示 div
- c# - 如何在 ListView 中的 ViewCell 中添加 Material Design 波纹效果?
- powershell - 如何从 Get-ADUser 以相同格式捕获和保存数据,但具有属性子集?
- svg - 如何使用 nVennR 在 RStudio 中生成 SVG 文件以在 Adobe Illustrator 中正确打开
- azure - 使用 Azure SDK for Java 从另一个 WebJob 触发 WebJob