Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293

Hibernate + Cannot add or update a child row: a foreign key constraint fails

05.05.2014, 17:31. Показов 7529. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть вот такая схема:

Соответственно два класса:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Entity
@Table(name = "item_orders")
public class ItemOrders implements Serializable{
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(strategy = "increment", name = "increment")
    @Column(name = "item_orders_id")
    private int itemOrderId;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "product_id", nullable = false)
    private Product product;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "order_id", nullable = false)
    private Orders order;
    
    @Column(name = "count")
    private int count;
 
    // getters and setters..
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Entity
@Table(name = "orders")
public class Orders implements Serializable {
 
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    @Column(name = "order_id")
    private int orderId;
 
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "account_id", nullable = false)
    private Account account;
 
    @Column(name = "status")
    private String status;
 
    @OneToMany(mappedBy = "itemOrderId", fetch = FetchType.EAGER)
    private Set<ItemOrders> itemOrders = new HashSet<>(0);
 
    // getters and setters..
 
}


Таким образом пытаюсь добавить элементы в бд.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
final Orders order = new Orders();
        
        order.setAccount(account);
        order.setStatus("new");
        DAO.Factory.getInstance().getOrdersDAO().addOrder(order);
        ItemOrdersDAO itemOrdersDAO = DAO.Factory.getInstance().getItemOrdersDAO();
        ItemOrders item;
        
        for (Cart cart : carts) {
            item = new ItemOrders();
            item.setCount(cart.getCount());
            item.setProduct(cart.getProduct());
            item.setOrder(order); 
            itemOrdersDAO.addItemOrders(item);
            
        }
Объект order добавляется в бд а вот объекты item нет, вылетает из иключенням:
Code
1
2
3
4
5
6
Cannot add or update a child row: a foreign key constraint fails (`gigabyte`.`item_orders`, CONSTRAINT `FK_cbmd6f8fnerqtat9y8fs9it0v` FOREIGN KEY (`item_orders_id`) REFERENCES `orders` (`order_id`))
Info:   HHH000010: On release of batch it still contained JDBC statements
Warning:   #{user.order()}: org.hibernate.exception.ConstraintViolationException: could not execute statement
javax.faces.FacesException: #{user.order()}: org.hibernate.exception.ConstraintViolationException: could not execute statement
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
    at javax.faces.component.UICommand.broadcast(UICommand.java:315)
Пишет что проблема с внешним ключом, но что это за проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.05.2014, 17:31
Ответы с готовыми решениями:

JPA/Hibernate MappingException: Foreign key must have same number
Вот описание ошибки. org.hibernate.MappingException: Foreign key (FK_n9nvapt8aqpregmwepb98hjed:questions )) must have same number of...

[Hibernate] A Foreign key has the wrong number of column. should be 0
Ошибка: Initial SessionFactory creation failed.org.hibernate.AnnotationException: A Foreign key refering com.artmal.model.Teacher from...

Cannot add or update a child row: a foreign key constraint fails
Вот код ошибки: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrity ConstraintViolationException: Cannot add or update a child row: a...

11
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 18:26  [ТС]
Заметил странную штуку: если добавлять элементы вот таким образом, то все работает, но если раскомментировать цикл или попробовать добавить еще один элемент, то программа рушится.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Session session = HibernateUtil.getSessionFactory().openSession();
        session.getTransaction().begin();
        Orders order = new Orders();
        Set<ItemOrders> items = new HashSet<>(0);
        order.setAccount(account);
        order.setStatus("new");
 
        session.save(order);
 
//        for (Cart cart : carts) {
            ItemOrders item = new ItemOrders();
            item.setCount(1);
            item.setOrder(order);
            order.getItemOrders().add(item);
            session.save(item);
//        }
 
 
        session.getTransaction().commit();
        session.close();
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.05.2014, 19:23
Java
1
2
           item.setOrder(order);
            order.getItemOrders().add(item);
У вас в Order есть ссылка на его items и наоборот? Что-то мне тут кажется неправильным. Судя по БД ордер не знает какие items в нем присутствуют. Может быть проблема в этом. Если вы скопируете

Java
1
2
3
4
5
           ItemOrders item = new ItemOrders();
            item.setCount(1);
            item.setOrder(order);
            order.getItemOrders().add(item);
            session.save(item);
И попробуете например добавить 2 items то будет ошибка скорее всего.
1
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 19:40  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
У вас в Order есть ссылка на его items и наоборот?
Конечно есть, вот:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Entity
@Table(name = "item_orders")
public class ItemOrders implements Serializable{
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(strategy = "increment", name = "increment")
    @Column(name = "item_orders_id")
    private int itemOrderId;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "product_id", nullable = false)
    private Product product;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "order_id", nullable = false)
    private Orders order;
    
    @Column(name = "count")
    private int count;
 
    // getters and setters..
}
 
 
@Entity
@Table(name = "orders")
public class Orders implements Serializable {
 
    @Id
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    @Column(name = "order_id")
    private int orderId;
 
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "account_id", nullable = false)
    private Account account;
 
    @Column(name = "status")
    private String status;
 
    @OneToMany(mappedBy = "itemOrderId", fetch = FetchType.EAGER)
    private Set<ItemOrders> itemOrders = new HashSet<>(0);
 
    // getters and setters..
 
}
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.05.2014, 19:45
А зачем вас обе ссылки если в БД ссылка только с одной стороны?
1
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 19:54  [ТС]
Нашел одну ошибку, но все равно проблема не пропала.
Java
1
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER)
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
А зачем вас обе ссылки если в БД ссылка только с одной стороны?
Что вы этим подразумеваете? Я что-то не понял вопрос..
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.05.2014, 20:04
попробуйте из класса Orders убрать ссылку на itemOrders
0
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 20:14  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
попробуйте из класса Orders убрать ссылку на itemOrders
Не помогло. И вообще если это сделать потеряется смысл всего) А смысл такой: в одном объекте "заказ"(order) повино содержаться информация о пользователе который сделал заказ (account), статус заказа (status), и именно сами товары (itemOrders). Вот как раз проблема в том, что нельзя добавить информация о товарах (itemOrders).
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.05.2014, 20:28
Попробуйте тогда сначала заполнить ордер всеми элементами, включая orderItems все а потом сохранить Order вместо того чтобы сохранять каждый элемент отдельно.
1
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 20:38  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Попробуйте тогда сначала заполнить ордер всеми элементами, включая orderItems все а потом сохранить Order вместо того чтобы сохранять каждый элемент отдельно.
Пробовал и так. order сохраняет а вот itemOrders нет.
А если попробовать вот так:
Java
1
2
@OneToMany(mappedBy = "order", fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
private Set<ItemOrders> itemOrders = new HashSet<>(0);
То вылетает такая же ошибка.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.05.2014, 20:45
У меня дома нет подходящего проекта где это можно проверить. Завтра буду на работе посмотрю будет ли у меня ошибка в такой же ситуации.
0
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
06.05.2014, 20:54  [ТС]
Наконец нашел в чем была ошибка! Все предложенные варианты правильные! Ошибка была в самой бд. Когда дропнул всю бд и залил заново, все заработало! Не знаю почему в предыдущей бд первичный ключ выступал также и в роли внешнего ключа, об этом было написано в логах, нужно было лишь немного внимания чтобы увидеть что не так)
Code
1
2
3
FOREIGN KEY (`item_orders_id`) REFERENCES `orders` (`order_id`))
//А должно быть
FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.05.2014, 20:54
Помогаю со студенческими работами здесь

Cannot add or update a child row: a foreign key constraint fails
Здравствуйте! Изучая MySQL и PHP столкнулся с такой вот проблемкой: Cannot add or update a child row: a foreign key constraint fails...

Cannot add or update a child row: a foreign key constraint fails
Доброе время суток. Являюсь полнейшим профаном в MySql и в базах данных собственно тоже. Создавал базу данных и таблицы в mysql...

Cannot add or update a child row: a foreign key constraint fails
Такая проблема: не добавляется значение в таблицу через запрос mysql_query. Если тоже самое делать через phpmyadmin - всё работает... ...

Cannot add or update a child row: a foreign key constraint fails
Всем привет. Буду рад помощи. Столкнулся с ошибкой. 123Cannot add or update a child row: a foreign key constraint fails...

#1452 - Cannot add or update a child row: a foreign key constraint fails
При добавлении данных выдает эту ошибку: #1452 - Cannot add or update a child row: a foreign key constraint fails...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru