Спящий режим, контрольно-измерительные приборы и порядок удаления каскада - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть сложный граф объектов с JPA-связанными объектами. Когда я удаляю родителя, удаления правильно касаются детей.

Затем я использую родительский класс (чтобы не загружать однозначно отношения), а при удалении получаю исключения нарушения ссылочной целостности. Глядя на проблемы спящего режима запросов после сброса, я вижу, что hibernate действительно пытается удалить записи в неправильном порядке, поэтому БД жалуется на ссылочную целостность и выдается исключение.

Почему это проявляется только тогда, когда сущности инструктируются? Есть ли способ изменить порядок удаления каскада?

1 Ответ

1 голос
/ 25 февраля 2010

У меня нет ответа на ваш вопрос, но ... почему вы возитесь с "инструментарием", чтобы сделать вашу личную ассоциацию лениво загруженной? Я проверил следующее для взаимно-однозначной связи между классом Foo и его FooDetail:

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
public FooDetail getFooDetail() {
    return detail;
}

и лени-загрузка просто работает . Это оператор, выполняемый при получении экземпляра Foo:

Hibernate: select foo0_.id as id45_0_, foo0_.detail_id as detail3_45_0_, foo0_.shortName as shortName45_0_ from Foo foo0_ where foo0_.id=?

А позже, при вызове геттера, FooDetail извлекается:

Hibernate: select foodetail0_.id as id46_0_, foodetail0_.fullName as fullName46_0_ from FooDetail foodetail0_ where foodetail0_.id=?

И удаление данного Foo экземпляра также работает отлично, операторы выполняются в правильном порядке:

Hibernate: delete from Foo where id=?
Hibernate: delete from FooDetail where id=?

Ниже DDL, сгенерированный Hibernate для соответствующих таблиц для справки:

create table Foo (id bigint not null, shortName varchar(255), detail_id bigint, primary key (id))
create table FooDetail (id bigint not null, fullName varchar(255), primary key (id))
alter table Foo add constraint FK212C3F68B31178 foreign key (detail_id) references FooDetail

Протестировано с аннотациями Hibernate 3.4.0.GA.

Обновление: Если это не то, что вы ищете, тогда используйте ассоциацию один-ко-многим, есть ограничения с ассоциацией один-к-одному (и, пожалуйста, уточните свой вопрос, читатели не могут догадаться, что ты не пишешь).

...