JPQL и данные сущностей - PullRequest
       82

JPQL и данные сущностей

0 голосов
/ 06 января 2020

У меня есть сущность Student с двумя полями: id, name. Я сохраняю ее в базе, используя entityManager persist (), затем, используя JPQL, обновляю одну сущность и получаю ее. Данные в сущности старые. Почему? но в БД все данные сущности меняются.

public class Main {

    public static void main(String[] args) {

        EntityManagerFactory myFactory = Persistence.createEntityManagerFactory("myPerName777");
        EntityManager entityManager = myFactory.createEntityManager();

        EntityTransaction transaction = entityManager.getTransaction();
        transaction.begin();

        entityManager.persist(new Student("max"));
        entityManager.persist(new Student("max"));
        entityManager.persist(new Student("max"));

        entityManager.persist(new Student("mike"));
        entityManager.persist(new Student("mike"));

        transaction.commit();

        transaction.begin();
        Query query = entityManager.createQuery("UPDATE Student s set s.userrname='JOHN' where s.id=1");
        query.executeUpdate();
        transaction.commit();

        Student student = entityManager.find(Student.class,1);
        System.out.println(student.getUserrname());

        entityManager.close();
        myFactory.close();
    }
}

Этот код возвращает Max, но в БД дата меняется. Как я могу вернуть фактические данные?

1 Ответ

0 голосов
/ 06 января 2020

С помощью executeUpdate вы выполняете оператор SQL (изменяя непосредственно БД), но не изменяете объект, загруженный / управляемый Hibernate, следовательно, вы храните устаревшие данные в своем приложении.

Лучший подход всегда работать с объектами Hibernate, которые управляются Hibernate и хранятся в кэше первого уровня. Ваши данные синхронизируются с БД.

Если вам действительно нужно выполнить оператор (например, потому что это сложный оператор или работает намного лучше), вам нужно выселить объект и перезагрузить его снова из БД. .

...