Hibernate 休眠未正确保存数据库中的对象(?,,?,?)
从问题开始。(我正在使用Hibernate 4。) 正如在其中一个答案中所建议的,我尝试使用反馈到反馈的方法 在我的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
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
,并不能解决问题。:(在将添加到产品后,仍然采用相同的行为实现了可序列化它起作用:)谢谢你的回答。即使不能完全解决我的问题,我也会接受的!