Как обновить сущность JPA, используя Querydsl?

Emmanuel Guiton спросил: 13 октября 2017 в 06:05 в: java

Я пытаюсь запросить JPA с помощью Querydsl (4.1.4), как написано здесь http://www.querydsl.com/static/querydsl/latest/reference/html/ch02.html#jpa_integration. Я использую Hibernate (5.2.12.Final) в качестве бэкэнда JPA. Я генерирую типы запросов Querydsl из аннотированных классов JPA, используя apt-maven-plugin с процессором com.querydsl.apt.jpa.JPAAnnotationProcessor.

У меня проблема при обновлении объекта: обновленное значение не отображается в коде Java. Вот соответствующий фрагмент кода, который обновляет логическое свойство (с именем success) в Entity:

    final EntityManagerFactory entityManagerFactory = PersistenceTestUtils.buildEntityManagerFactory();
    final EntityManager entityManager = entityManagerFactory.createEntityManager();
    final EntityTransaction transaction = entityManager.getTransaction();
    transaction.begin();
    final QJpaUpdateRound qJpaUpdateRound = QJpaUpdateRound.jpaUpdateRound;
    final JPQLQueryFactory queryFactory = new JPAQueryFactory(entityManager);    final QJpaUpdateRound qJpaUpdateRound = QJpaUpdateRound.jpaUpdateRound;
    final JPQLQueryFactory queryFactory = new JPAQueryFactory(entityManager);
    final long roundId = 3L;    System.out.println("Original " +originalRound);    queryFactory //
        .update(qJpaUpdateRound) //
        .set(qJpaUpdateRound._success, true) //
        .where(qJpaUpdateRound._id.eq(roundId)) //
        .execute();    // entityManager.clear(); // Workaround    // Fetch the updated value
    final UpdateRound updatedRound = queryFactory //
        .selectFrom(qJpaUpdateRound) //
        .where(qJpaUpdateRound._id.eq(roundId)) //
        .fetchOne();
    transaction.commit();
    System.out.println("Updated "+ updatedRound);

Это печатает:

Original JpaUpdateRound {id = 3; instant = 2017-11-06T19: 27: 01.141Z; success = false}
Обновлен JpaUpdateRound {id = 3; instant = 2017-11-06T19: 27: 01.141Z; success = false}

Кроме того, проверка идентичности для originalRound и updatedRound показывает, что обе переменные являются одним и тем же экземпляром.

    entityManager.clear(); // Workaround

Программа напечатает

Original JpaUpdateRound {id = 3; instant = 2017-11-06T19: 39: 01.038Z; success = false}
Обновлен JpaUpdateRound {id = 3; instant = 2017-11-06T19: 39: 01.038Z; success = true}

, что является ожидаемым результатом.

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

Почему? Как я могу синхронизировать бэкэнд JPA и Querydsl?


0 ответов