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();
}
如果我尝试打印 feedback
和 feedbackDto
的内容,我得到了我所期望的,但是 运行 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
}
}
来自
正如我尝试使用 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
(?, ?, ?, ?)
这是我用来创建反馈的创建语句 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
}
}