Hibernate: java. sql .SQLIntegrityConstraintViolationException: невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать отношения один на один в 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();

1 Ответ

0 голосов
/ 29 мая 2020

В вашем примере вы пытаетесь сохранить объект student, для которого ассоциация laptop не существует в базе данных. Оба экземпляра созданы заново, насколько можно понять из предоставленного вами фрагмента кода. Следовательно, в соответствии с внешним ограничением на уровне базы данных вы пытаетесь ссылаться на таблицу laptop из таблицы student; где соответствующая строка laptop с указанным id не существует.

Если вы также сохраните связанный объект laptop при сохранении объекта student, ваша проблема будет решена. Единственное изменение, которое вам нужно сделать, это обновить отношение @OneToOne как:

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

Это будет работать; поскольку он также вставит сущность laptop в базу данных вместе с самой сущностью student.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...