PersistenceException: ОШИБКА, выполняющая DML bindLog[] - нарушает внешний ключ
У меня 3 лица.
public class Masterpiece {
@Id
public Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Product> products;
}
public class Product {
@Id
public Long id;
}
public class Purchase {
@Id
public Long id;
@OneToMany(fetch = FetchType.EAGER)
private List<Product> productList;
}
Когда я пытаюсь сохранить шедевр с продуктами, я получаю сообщение об ошибке:
вставка или изменение в таблице "product" нарушает внешний ключ "fk_product_purchase_4" \ n Подробности: ключ (purchase_id) = (1) не встречается при "покупке"
Я использую ebean генерируется ddl.
1 ответ
У вас есть два отношения OneToMany с продуктом, хорошо? Поскольку вы создаете шедевр, он создаст продукт. Однако в этом случае не создается объект покупки. Согласно этому https://en.wikibooks.org/wiki/Java_Persistence/OneToMany (см. Раздел "Присоединение к таблице"), другая сторона (в данном случае продукты) должна иметь обратный внешний ключ. В вашей проблеме это означает обратную ссылку внешнего ключа на Шедевр и Закупку, но Покупка не существует, когда вы создаете связь Шедевр и Продукт. Возможно, решение состоит в том, чтобы сопоставить его с ManyToOne назад или с помощью таблицы соединений в каждом вашем OneToMany (шедевр и покупка), получая отдельные таблицы для каждого отношения. Я надеюсь, что это может быть полезно!