【问题标题】:Error SQL Error: 1452, SQLState: 23000, using hibernate and javafx错误 SQL 错误:1452,SQLState:23000,使用休眠和 javafx
【发布时间】:2018-06-12 07:54:39
【问题描述】:

我在尝试将数据保存到包含外键列的表中时遇到此错误。

这是我的场景,我从两个不同的 ComboBox 中选择两个选项(每个不同的 ComboBox 中的一个选项),我编写了两个字符串,所有这些都是为了构建要保存的对象,但是在提交时出现此错误:

警告 SqlExceptionHelper - SQL 错误:1452,SQLState:23000 错误 SqlExceptionHelper - 无法添加或更新子行:外键约束失败 (students.student, CONSTRAINT fk_student_career 外键 (student_career) 参考 career (career_name) ON DELETE NO ACTION ON更新无操作) ERROR ExceptionMapperStandardImpl - HHH000346:托管刷新期间出错 [org.hibernate.exception.ConstraintViolationException:无法执行语句]

These are my classes 我将它们放在我的 gists 存储库中,以使这篇文章有点短。

我学习了很多教程并阅读了很多信息,但无法让它发挥作用。我使用了 cascadetype、JoinColumn 和许多其他东西,但都失败了……

请帮帮我……

P.S.:我是自学的,这是一种练习。

【问题讨论】:

标签: java mysql hibernate javafx


【解决方案1】:

将Student 类映射(我只包含相关部分)更改为:

@Entity
@Table(name = "student", catalog = "students")
public class Student implements java.io.Serializable {

    ...

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "student_career",referencedColumnName="career_name" nullable = false)
    private Career career;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "student_section", nullable = false)
    private Section section;

    ...
}
  • referencedColumnName 用于将Career 外键显式映射到正确的列career_name 而不是其id career_id,请查看此相关question 以获取更多详细信息。

    李>
  • 已添加CascadeType.PERSIST 以同时保存到Career 和Section,同时保存Student,如果没有,数据库将找不到Student 外键的相应记录,(我想,这就是SqlExceptionHelper)的由来

【讨论】:

  • 哇!最后!谢谢楼主,解决了我的问题!非常感谢,我真的很感激这个帮助!非常感谢!我不知道这是最好的方法还是最好的方法!但它奏效了。
  • 很高兴有帮助! I don't know if is the best method or the best way to do it!,在实现之前写一个测试场景,如果测试通过那么你的方法是正确的。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 2019-01-21
  • 2015-02-11
  • 1970-01-01
相关资源
最近更新 更多