JPA каскадные параметры во время выполнения - PullRequest
5 голосов
/ 23 декабря 2008

Я пытаюсь создать приложение, которое синхронизирует объектную модель с базой данных, наблюдая за всеми изменениями, а затем немедленно сохраняя объекты в вопросах. Многие объекты в модели имеют детей в больших списках или деревьях.

Когда я загружаю объект из базы данных, я полагаюсь на одностороннее каскадное отношение, чтобы также извлечь все его дочерние элементы и включить их в приложение.

Однако можно изменить поле в родительском объекте, которое требует сохранения, и я могу определить, что ни один из дочерних элементов не затронут. Поэтому я хотел бы сохранить родительский объект, не обращаясь к базе данных со всеми сохраненными каскадными дочерними объектами.

например

@Entity
public class Parent {

    @OneToMany(cascade=CascadeType.ALL)
    public List children;

}

Как я могу переопределить параметр каскада, когда я сохраняю родительский объект? Или я должен просто установить его в REFRESH и убедиться, что мне никогда не понадобится каскадное сохранение?

1 Ответ

4 голосов
/ 23 декабря 2008

Чтение объектов из базы данных и их сохранение основаны на двух разных аннотациях.

Когда вы загружаете объект, он также получает другой конец любых нетерпеливых (FetchType.EAGER) отношений, как определено свойством fetch в отношении.

В зависимости от вашего провайдера JPA, у вас могут быть варианты переопределить это поведение. EclipseLink, через невероятно полезную QueryHint.BATCH, безусловно, делает.

Когда вы сохраняете, удаляете или обновляете информацию, каскадный тип имеет значение.

Итак, потеряйте каскад, сохраните выборку и проблему решите.

Лично я думаю, что все каскады напрашиваются на неприятности, но мнения будут разными.

У приличного поставщика JPA уже будет довольно сложная (настраиваемая) схема кэширования. Возможно, вам следует спросить, почему вы изобретаете именно это колесо?

Это проблема асинхронных обновлений исключительно для повышения производительности? Или причина в чем-то другом?

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