2015-03-23 5 views
0

В Spring Data Repository интерфейсов, следующая операция определена:Как правильно использовать Spring Data Repository # save()?

public T save(T entity); 

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

Я знаю об reasoning за этим решением, и это имеет смысл. Я также вижу, что это работает отлично для простых моделей с независимыми объектами. Но, учитывая более сложную модель JPA с большим количеством подключений @OneToMany и @ManyToMany, возникает следующий вопрос:

Как приложение должно использовать возвращенный объект, когда все остальная загруженная модель все еще ссылается на старую, которая была перешел в save(...)? Кроме того, в приложении могут быть коллекции, которые все еще содержат старый объект. JVM не позволяет глобально «обменивать» несохраненный объект с сохраненным.

Итак, каков правильный шаблон использования? Любые лучшие практики? До сих пор я встречал только примеры игрушек, которые не используют @OneToMany или @ManyToMany и поэтому не сталкиваются с этой проблемой. Я уверен, что много умных людей думали долго и трудно об этом, но я не могу понять, как использовать это правильно.

ответ

1

Это описано в section 3.2.7.1 of the JPA specification, которое описывает, как должно работать merge. В двух словах, если управляемый экземпляр (существующий), он просто сохраняется на месте. Если нет, он копируется в управляемый экземпляр (который необязательно может быть другим объектом, поскольку спецификация не предусматривает, что в этом случае должен быть создан новый экземпляр), и все ссылки из экземпляра, сохраненного на другие управляемые объекты, также обновлен для обращения к управляемому экземпляру. Это, конечно, требует, чтобы отношения были правильно определены из сохраняемого объекта.

Действительно, это не распространяется на случай хранения экземпляра объекта в неуправляемой коллекции (такой как коллекция static). Это в любом случае нецелесообразно, поскольку постоянный объект должен всегда загружаться через механизм провайдера персистентности (кто знает, что экземпляр объекта может быть изменен в постоянном хранилище).

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

Смежные вопросы