JPA: нарушение ограничений при удалении - PullRequest
3 голосов
/ 09 мая 2011

У меня есть три объекта -

public class ApplicationEntity extends ModelEntity implements Application {
    @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    private CategoryEntity category;

    @ManyToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(
            joinColumns = {@JoinColumn(name = "APPLICATION_ID")},
            inverseJoinColumns = {@JoinColumn(name = "USER_ID")},
            uniqueConstraints = {@UniqueConstraint(columnNames = {"APPLICATION_ID", "USER_ID"})
            })
    private List<UserEntity> buyers = new ArrayList<UserEntity>();}

public class CategoryEntity extends ModelEntity implements Category {

    @Column(nullable = false)
    private String name;
    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<ApplicationEntity> applications = new ArrayList<ApplicationEntity>();
}

    public class UserEntity extends AbstractEntity  implements User {
}

При попытке удалить AppliationEntity я получаю исключение нарушения ограничений.Я попытался удалить запись приложения из CategoryEntity, а затем удалить ApplicationEntity.Но все равно не получается.Исключением является что-то вроде -

    Caused by: java.sql.SQLException: DELETE on table 'APPLICATIONENTITY' caused a violation of foreign key constraint 'FK109DF15D362F642' for key (32779).  The statement has been rolled back.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
    ... 61 more
Caused by: ERROR 23503: DELETE on table 'APPLICATIONENTITY' caused a violation of foreign key constraint 'FK109DF15D362F642' for key (32779).  The statement has been rolled back.

Любое предложение высоко ценится.Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

CategoryEntity имеет ссылку на ApplicationEntity, поэтому у вас возникает исключение нарушения ограничения при попытке удалить ссылочный экземпляр ApplicationEntity.

Вы должны включить CascadeType.REMOVE в category поле ApplicationEntity.

РЕДАКТИРОВАТЬ:

Документация JPA гласит:

УДАЛИТЬ - Если объект-владелец удален, цель ассоциации также удаляется.

Это означает, что при удалении ApplicationEntity CategoryEntity не будет удален. Только ассоциации между ними будут удалены.

РЕДАКТИРОВАТЬ:

Вы должны добавить CascadeType.REMOVE в buyers поле ApplicationEntity. Существует таблица отношений между ApplicationEntity и UserEntity, при попытке удалить ApplicationEntity все кортежи, которые ссылаются на удаленный ApplicationEntity в этой таблице отношений, должны быть удалены до ..

2 голосов
/ 09 мая 2011

Ошибка указывает, что какая-то другая таблица / объект имеет ссылку на ApplicationEntity. Кажется, это не CategoryEntity, поскольку OneToMany не определяет ограничение. Есть ли другие объекты? Вам необходимо удалить все ссылки на объект перед его удалением.

Это может быть ограничение из таблицы присоединения ManyToMany к UserEntity, но удаление должно быть сначала удалением из таблицы объединения, так что это странно.

Можете ли вы включить полную трассировку стека исключений.

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