Запрос выбора JPQL вызывает неожиданное увеличение значения версии объекта - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть простая сущность, Presentation (которая содержит коллекцию элементов встраиваемого элемента , но я думаю, что нет ни здесь, ни там ).РЕДАКТИРОВАТЬ: Кажется, очень важно.

Я добавил атрибут @Version и обнаружил, что при простом выборе JPQL значение столбца версии увеличивается, но только для одной из двух строк, которые существуют в таблице.

То, что я обнаружил, заключается в том, что завершение выбора в начале и принятии (я работаю в Java SE) - это то, что приводит к увеличению или уменьшению версии.Почему это?Это потому, что результаты выбора поступают в кэш EM, а затем при фиксации все в кэше распространяется на БД, независимо от того, изменилось ли какое-либо состояние в объекте?

Является ли это так или нет, может ли факт, что версия одной строки увеличивается, тогда как другая не объясняется?

@Entity
@Table(name="PRESENTATION")
public class Presentation {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id;
    private String name;

    @Version
    private int version;

    @ElementCollection
    @CollectionTable(name="PRES_ARTICLES", joinColumns=@JoinColumn(name="pres_id"))
    Set<Article> referencedArticles;
//..getters setters etc        

    }    
}

Основной класс:

static void selectPresData() {
    try {
        em.getTransaction().begin();
        System.out.println("before query..");
        em.createQuery("SELECT p FROM Presentation p", Presentation.class)
                .getResultList()
                .forEach(System.out::println); 
        System.out.println("before commit..");
        em.getTransaction().commit();

    } catch (Exception e) { ..//
    }
}

В строке с id = 1 столбец версии последовательно обновляется с помощью вышеуказанного кода, а в строке с id = 2 - нет.

Презентационный стол:

Presentation

Встраиваемый сборный стол:

pres_articles


EDIT Глядя на информацию журнала отладки в спящем режиме, я вижу, что обновление, удаление и вставки создаются для строки, которая имеет встраиваемую структуру (id = 1);но не для другой строки:

  ...
21:20:08,242 INFO  [Main.class] - running!
before query..
21:20:08,261 DEBUG [org.hibernate.SQL] - select presentati0_.id as id1_4_, presentati0_.name as name2_4_, presentati0_.version as version3_4_ from PRESENTATION presentati0_
21:20:08,327 DEBUG [org.hibernate.SQL] - select referenced0_.pres_id as pres_id1_3_0_, referenced0_.name as name2_3_0_ from PRES_ARTICLES referenced0_ where referenced0_.pres_id=?
Presentation [id=1, name=JPA 101, articles=[Article [name=How to use cascadeType], Article [name=How to use shared cache]]]
21:20:08,338 DEBUG [org.hibernate.SQL] - select referenced0_.pres_id as pres_id1_3_0_, referenced0_.name as name2_3_0_ from PRES_ARTICLES referenced0_ where referenced0_.pres_id=?
Presentation [id=2, name=Stats 101 and Toastmaking 101, articles=[]]
before commit..
21:20:08,365 DEBUG [org.hibernate.SQL] - update PRESENTATION set name=?, version=? where id=? and version=?
21:20:08,386 DEBUG [org.hibernate.SQL] - delete from PRES_ARTICLES where pres_id=?
21:20:08,387 DEBUG [org.hibernate.SQL] - insert into PRES_ARTICLES (pres_id, name) values (?, ?)
21:20:08,399 DEBUG [org.hibernate.SQL] - insert into PRES_ARTICLES (pres_id, name) values (?, ?)
21:20:08,480 INFO  [org.hibernate.orm.connections.pooling] - HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost:3306/JPA2?useSSL=false]
21:20:08,482 INFO  [Main.class] - done!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...