java - Hibernate 无法对具有外键的表进行持续工作

标签 java mysql hibernate

我有 2 个表 train_headertrain_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/

相关文章:

sql - 合并结果或留给客户端浏览器 javascript 的高效 SQL?

mysql - 查询中的sql server变量增量

java - retorfit2 如何让这个 json 正确?

java - 如何获取设备的 GPS 详细信息

java - Android 上的犀牛

mysql - 使用 View 或触发器预处理数据

Java - 如何解锁受密码保护的 PEM 私钥

java - 如何使用 hibernate 和 oracle 函数映射实体

java - 在 Spring Boot JPA 中使用 Hibernate 过滤器

java - 使用@Query( native 和JPQL)的Spring Data Jpa + Spring Projections为相关实体返回null