我有 2 个表 train_header
和 train_movement
。列车标题在列 id 上有一个主键。
火车移动
在列 header_id 上有一个链接到 train_header 的外键
ALTER TABLE `trains`.`train_movement`
ADD CONSTRAINT `foobar`
FOREIGN KEY (`header_id`)
REFERENCES `trains`.`train_headers` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
我的火车头的java类注释如下
@Entity
@Table(name="train_headers")
public class TrainHeader implements Serializable {
private int id;
private List<TrainMovement> trainMovements;
@Id
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
//bi-directional many-to-one association to TrainMovement
@OneToMany(mappedBy="trainHeader", cascade = {CascadeType.ALL})
public List<TrainMovement> getTrainMovements() {
return this.trainMovements;
}
public void setTrainMovements(List<TrainMovement> trainMovements) {
this.trainMovements = trainMovements;
}
public TrainMovement addTrainMovement(TrainMovement trainMovement) {
getTrainMovements().add(trainMovement);
trainMovement.setTrainHeader(this);
return trainMovement;
}
}
我的火车运动java类的注释如下
@Entity
@Table(name="train_movement")
public class TrainMovement implements Serializable {
private int id;
private TrainHeader trainHeader;
@Id
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
@ManyToOne
@JoinColumn(name="header_id")
public TrainHeader getTrainHeader() {
return this.trainHeader;
}
public void setTrainHeader(TrainHeader trainHeader) {
this.trainHeader = trainHeader;
}
}
最后保存所有内容的代码如下所示
TrainMovement m = new TrainMovement();
TrainHeader h = new TrainHeader();
h.setTrainMovements(new LinkedList<TrainMovement>()); //otherwise get null pointer exception
h.addTrainMovement(m);
entityManager.persist(h);
我的问题是当发生这种情况时我收到错误
Caused by: org.hibernate.exception.ConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`trains`.`train_movement`, CONSTRAINT `header_link_movement` FOREIGN KEY (`header_id`) REFERENCES `train_headers` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
为什么会发生这种情况?这个错误不是仅在火车移动的 header_id 值不在表中时才会发生吗? hibernate 不应该帮我处理这个问题吗?我该如何解决这个问题?我尝试删除级联(以防保存对象的顺序出现错误),但保存标题对象,然后保存移动对象仍然会导致同样的错误!
任何有关此事的帮助都会很棒。
最佳答案
问题是 hibernate 没有创建 id,解决方案是添加注释
@GenerateValue(strategy=GenerationType.IDENTITY)
到我的 ID 字段
关于java - Hibernate 无法对具有外键的表进行持续工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25239938/