У меня есть простая сущность, 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](https://i.stack.imgur.com/6mg7x.png)
Встраиваемый сборный стол:
![pres_articles](https://i.stack.imgur.com/emiAG.png)
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!