当我试图将对象保存到数据库时,我收到错误:
configuration.yaml
首先,我在java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`smartphones`.`smartphone`, CONSTRAINT `fk_smartphone_resolution1` FOREIGN KEY (`resolution_id`) REFERENCES `resolution` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
类中的引用列名称错误,但我检查了它,看起来很好。也许有人弄清楚这个问题的原因是什么?
短数据库截图
用于创建智能手机表的SQL脚本
Smartphone
CREATE TABLE IF NOT EXISTS `smartphones`.`smartphone` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL DEFAULT NULL,
`resolution_id` INT(11) NOT NULL,
...other
PRIMARY KEY (`id`, `resolution_id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC),
INDEX `fk_smartphone_resolution1_idx` (`resolution_id` ASC),
CONSTRAINT `fk_smartphone_resolution1`
FOREIGN KEY (`resolution_id`)
REFERENCES `smartphones`.`resolution` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
类,但有一个关系对象。
Smartphone
[编辑:解析智能手机型号并保存到数据库]
package com.project.model;
import javax.persistence.*;
@Entity
public class Smartphone {
private int id;
private String name;
private Resolution resolutionId;
@Id
@Column(name = "id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@ManyToOne(fetch=FetchType.EAGER, cascade=CascadeType.PERSIST)
@JoinColumn(name = "resolution_id", referencedColumnName = "id", nullable = false)
public Resolution getResolutionId() {
return resolutionId;
}
public void setResolutionId(Resolution resolutionId) {
this.resolutionId = resolutionId;
}
}
[编辑:已添加]分辨率等级:
@RequestMapping(value = { "apple" }, method = RequestMethod.GET)
public String parseApple(ModelMap model) {
try {
String appleData = Utilities.getResourceAsString(this, "json/apple.json");
JSONArray array = new JSONArray(appleData);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
for (int i = 0; i < array.length(); i++) {
Smartphone smartphone = new Smartphone();
String resolutionValue = array.getJSONObject(i).getString("resolution");
String resolution_w = resolutionValue.split(" ")[0];
String resolution_h = resolutionValue.split(" ")[2];
Resolution resolution = new Resolution();
resolution.setHeight(Integer.valueOf(resolution_h));
resolution.setWidth(Integer.valueOf(resolution_w));
resolution.setTypeId(typeService.findByCode(session, Resolution.serialId));
session.save(resolution);
smartphone.setResolutionId(resolution);
//other
session.save(smartphone);
break;
}
transaction.commit();
sessionFactory.close();
} catch (IOException e) {
e.printStackTrace();
}
return "index";
}
答案 0 :(得分:2)
根据add/update
中存储的值,您尝试将resolution
行id
设置为smartphone
字段的有效值。
您必须先将行插入resolution
表。
答案 1 :(得分:1)
差不多好。您必须为getId()
类和以下类似代码添加上述Resolution
方法。保存方法调用后,您的resolution
对象可能始终为id
。
@Column(name = "id", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)