Как организация получает идентификатор до совершения транзакции в JPA / Play? - PullRequest
7 голосов
/ 17 ноября 2011

См. Этот вопрос .

Оказывается, что даже без фиксации транзакции вручную, до фиксации TX, у человека есть идентификатор после вызова метода save ().

Разве база данных не отвечает за заполнение поля идентификатора?Если да, то как можно заполнить поле идентификатора перед фиксацией?Происходит ли какая-либо связь с БД до передачи TX?

Ответы [ 4 ]

9 голосов
/ 17 ноября 2011

Да, JPA разрешено связываться с БД до принятия транзакции.Это может произойти, т. Е. Когда вы явно вызываете EntityManager#flush().

Более того, провайдеру JPA разрешено выполнять операцию сброса всякий раз, когда он чувствует, что это необходимо.Однако для удобства провайдеры JPA откладывают операции БД до времени, когда транзакция будет зафиксирована.

Некоторые стратегии автоматического генератора идентификаторов должны попадать в базу данных, чтобы получить значение PK (насколько я помню IDENTITYстратегия работает именно так).
Напротив, генераторы TABLE или SEQUENCE не обязательно должны нажимать на БД, чтобы получить значение ID.Они используют параметр allocationSize, чтобы запросить ТАБЛИЦУ или ПОСЛЕДОВАТЕЛЬНОСТЬ БД для пакета идентификаторов, которые будут переданы новым объектам без дальнейшей связи с базой данных.

3 голосов
/ 17 ноября 2011

Играть!сбрасывает контекст постоянства (который записывает изменения в базу данных и позволяет ему получить сгенерированный идентификатор) каждый раз, когда вы сохраняете объект с помощью метода save () в модели:

из JPABase._save ()исходный код:

if (!em().contains(this)) {
    em().persist(this);
    PlayPlugin.postEvent("JPASupport.objectPersisted", this);
}
// ...
try {
    em().flush();
} catch (PersistenceException e) {
    // ...
}
0 голосов
/ 11 мая 2013

Между begintransaction и commit после метода сохранения или обновления вызова вы должны использовать:

EntityManagerHelper.getEntityManager().flush();

Если вы не вызываете его, объект будет потерян и не может быть сохранен в БД.

Таким образом, после вызова его вы возьмете его идентификатор в объекте.

0 голосов
/ 17 ноября 2011

как я знаю, мы не можем получить идентификатор объекта (предположим, что он автоматически пронумерован) до его сохранения. и я лично считаю, что довольно опасно назначать что-то, что должно быть сделано СУРБД вне ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...