Вопрос о сбросе с JPA перед вызовом запроса - PullRequest
3 голосов
/ 11 декабря 2010

Просто быстрый вопрос, а необходима ли очистка в этом коде?Обратите внимание, что это будет внутри транзакции JPA.

User user = new User();
em.persist(user);

em.flush;

User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));

Или это будет работать без сброса?

User user = new User();
em.persist(user);

User aUser = em.find(User.class,user.getId());
assert(user.equals(aUser));

Или тот же вопрос, но более сложный пример:

User user = em.find(User.class,id);
user.setName("My Name");
em.merge(user);

em.flush; //Is this line needed?

User aUser = em.createQuery("select u from User where u.name = 'My Name');
assert(user.equals(aUser));

1 Ответ

8 голосов
/ 11 декабря 2010

В первом случае сброс необходим, если User имеет автоматически сгенерированный идентификатор, так как он не был назначен до сброса.Если id не генерируется, em.find() вернет тот же экземпляр из контекста постоянства, поэтому очистка не требуется.

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

...