java - Hibernate:java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败

标签 java hibernate jpa

我正在尝试在 Jpa 中创建一对一的关系。当我运行这个程序时抛出异常

ERROR: Cannot add or update a child row: a foreign key constraint fails (`ngsharma`.`student`, CONSTRAINT `FK8nqh8nm4hrwx9hlqwhxf6kfen` FOREIGN KEY (`laptop_lid`) REFERENCES `laptop` (`lid`))

学生

@Entity(name = "student")
public class Student {

    @Id 
    private  int rollno;
    private String name;    
    @OneToOne 
    private Laptop laptop;

    /*Setter & Getter*/
}

笔记本电脑

@Entity(name = "laptop")
public class Laptop {

    @Id
    private int lid;
    private String laptopName;

    /*Setter & Getter*/
}

Hibernate.cfg.xml

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ngsharma</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MariaDBDialect</property>
        <property name="hbm2ddl.auto">create</property>
        <property name="show_sql">true</property>
    </session-factory>
</hibernate-configuration>

运行类

    Configuration configuration = 
            new Configuration().configure()
                                                    .addAnnotatedClass(Student.class).addAnnotatedClass(Laptop.class);

    SessionFactory sessionFactory = configuration.buildSessionFactory();

    Session session = sessionFactory.openSession();

    Laptop laptop = new Laptop();
    laptop.setLid(101);
    laptop.setLaptopName("Mac Nootbook");

    Student student = new Student();
    student.setRollno(1);
    student.setName("Shri Krishan");
    student.setLaptop(laptop);

     Serializable serializable = session.save(student);
     System.out.println("Test Code : "  + serializable);

     session.beginTransaction().commit();

最佳答案

在您的示例中,您尝试保存一个 student 实体,而数据库中不存在该实体的 laptop 关联。据您提供的代码片段了解,这两个实例都是新创建的。因此,根据数据库级别的外部约束,您尝试从 student 表中引用 laptop 表;其中引用 id 的相应 laptop 行不存在。

如果您在保留 student 实体的同时还保留了关联的 laptop 实体,您的问题将得到解决。您需要做的唯一修改是将 @OneToOne 关系更新为:

    @OneToOne(cascade=CascadeType.PERSIST)  
    private Laptop laptop;

这会起作用;因为它还会将 laptop 实体与 student 实体本身一起插入数据库。

关于java - Hibernate:java.sql.SQLIntegrityConstraintViolationException:无法添加或更新子行:外键约束失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62071628/

相关文章:

java - JPA Spring 存储库日期过滤返回空数组

java - 将 Oracle 10g 数据库迁移到 Microsoft SQL 2008 R2 的最佳实践是什么?应用程序正在使用 Hibernate

java - 在运行时配置实体

Spring 数据可分页和 LIMIT/OFFSET

java - 当 Spring MVC 不是 MVC 框架时,为什么这样调用它?

java - 如何在 scala 的构建工具 (sbt) 中修复 "InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty"?

java - 无法使用 "this"引用对象创建链表

java - 一个包含所有英语单词的 Java 数组? (或具有相同效果的东西)

hibernate --org.hibernate.TransactionException : Transaction not successfully started

java.lang.IllegalStateException : Unable to retrieve EntityManagerFactory for unitName CrudPU 错误