EntityManager не обновляет данные после запроса - PullRequest
5 голосов
/ 14 марта 2011

Мой текущий проект использует HSQLDB2.0 и JPA2.0.

Сценарий таков: я запрашиваю БД, чтобы получить список contactDetails из person. Я удаляю один contactInfo в интерфейсе пользователя, но не сохраняю эти данные ( Отмена часть сохранения).

Я снова делаю тот же запрос, теперь список результатов на 1 меньше, чем предыдущий результат, потому что я удалил один contactInfo в пользовательском интерфейсе. Но это contactInfo все еще доступно в БД, если я перепроверю.

Но если я включу entityManager.clear() перед началом запроса, я получаю правильные результаты каждый раз.

Я не понимаю этого поведения. Может ли кто-нибудь дать мне понять?

Ответы [ 2 ]

16 голосов
/ 14 марта 2011

Вместо того, чтобы запрашивать снова, попробуйте это:

entityManager.refresh(person);

Более полный пример:

EntityManagerFactory factory = Persistence.createEntityManagerFactory("...");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();

Person p = (Person) em.find(Person.class, 1);
assertEquals(10, p.getContactDetails().size()); // let's pretend p has 10 contact details
p.getContactDetails().remove(0);
assertEquals(9, p.getContactDetails().size());

Person p2 = (Person) em.find(Person.class, 1);
assertTrue(p == p2); // We're in the same persistence context so p == p2
assertEquals(9, p.getContactDetails().size());

// In order to reload the actual patients from the database, refresh the entity
em.refresh(p);
assertTrue(p == p2);
assertEquals(10, p.getContactDetails().size());
assertEquals(10, p2.getContactDetails().size());

em.getTransaction().commit();
em.close();
factory.close();
2 голосов
/ 14 марта 2011

Поведение clear() объясняется в его javadoc:

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

То есть удаление contactInfo не сохраняется.

ContactInfo не удаляется из базы данных, поскольку вы удаляете отношения между ContactDetails и ContactInfo, но не ContactInfo. Если вы хотите удалить его, вам нужно либо сделать это явно с remove(), либо указать orphanRemoval = true в отношении.

...