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 (шедевр и покупка), получая отдельные таблицы для каждого отношения. Я надеюсь, что это может быть полезно!

Другие вопросы по тегам