MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails
Ошибка MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails может возникать при попытке вставить в ассоциированную таблицу запись без Id, на который ссылается внешний ключ второй таблицы.
Пример:
Первая таблица goods с описанием товара:
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 |
@Entity @javax.persistence.Table(name = "goods", schema = "", catalog = "nldb") public class GoodsEntity { private int id; @Id @javax.persistence.Column(name = "id", nullable = false, insertable = true, updatable = true) public int getId() { return id; } private QuantitiesEntity quantity; @OneToOne(mappedBy = "goods",cascade = CascadeType.ALL) public QuantitiesEntity getQuantityByQuantityId() { return quantity; } public void setQuantityByQuantityId(QuantitiesEntity quantity) { this.quantity = quantity; } public void addQuantities(QuantitiesEntity quantityById) { quantityById.setGoods(this); setQuantityByQuantityId(quantityById); } |
У нее есть id и она имеет отношение один-к-одному с таблицей quantities.
Таблица Quantities:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
@Entity @Table(name = "quantities", schema = "", catalog = "nldb") public class QuantitiesEntity { private int id; //список переменных private GoodsEntity goods; @OneToOne(cascade = CascadeType.ALL) @JoinColumn(name = "goods_id" ,referencedColumnName = "id") public GoodsEntity getGoods() { return goods; } public void setGoods(GoodsEntity goods) { this.goods = goods; } @Id @Column(name = "id", nullable = false, insertable = true, updatable = true) public int getId() { return id; } |
Вторая таблица quantities имеет ссылку на сущность GoodsEntity (таблица goods). В таблице quantities есть внешний ключ (foreign key) goods_id, который указывает на id в таблице goods.
Как возникает ошибка:
1 2 3 4 5 6 7 8 9 |
GoodsEntity goodsEntity = new GoodsEntity(); goodsEntity.setPartnumber("MH0W2RU/A") QuantitiesEntity quantitiesEntity = new QuantitiesEntity(); quantitiesEntity.setKaluzhskaya(299,9); goodsEntity.addQuantities(quantitiesEntity); service.save(goodsEntity); |
Создаем запись для первой таблицы. Создаем запись, которая указывается в первой таблице по внешнему ключу, которая должна быть записана во вторую таблицу с id из первой. При попытке записи сразу в две таблицы получим ошибку, которая говорит, что ключа (id) у первой таблицы goods еще нет, а значит нам нечего записывать в foreign key (goods_id) во второй таблице quantities.
Решение:
1 2 3 4 5 6 7 8 9 10 11 |
@Entity @javax.persistence.Table(name = "goods", schema = "", catalog = "nldb") public class GoodsEntity { private int id; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @javax.persistence.Column(name = "id", nullable = false, insertable = true, updatable = true) public int getId() { return id; } |
Прописываем создание id в первой сущности.
4