Когда использовать EntityManager.find() и EntityManager.getReference() с JPAJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Когда использовать EntityManager.find() и EntityManager.getReference() с JPA

Сообщение Anonymous »

Я столкнулся с ситуацией (которая мне кажется странной, но, возможно, вполне нормальной), когда я использую EntityManager.getReference(LObj.getClass(), LObj.getId()) для получения объекта базы данных а затем передать возвращенный объект для сохранения в другой таблице.
Итак, в основном процесс был таким:

class TFacade{

createT(FObj, AObj) {
T TObj = new T();
TObj.setF(FObj);
TObj.setA(AObj); ...
EntityManager.persist(TObj);
...
L LObj = A.getL();
FObj.setL(LObj);
FFacade.editF(FObj);
}

@TransactionAttributeType.REQUIRES_NEW
класс FFacade{

editF(FObj) {
L LObj = FObj.getL();
LObj = EntityManager.getReference(LObj.getClass(), LObj.getId());
...
EntityManager. merge(FObj);
...
FLHFacade.create(FObj, LObj);
}

@TransactionAttributeType.REQUIRED
class FLHFacade{

createFLH(FObj, LObj){
FLH FLHObj = new FLH();
FLHObj.setF(FObj);
FLHObj.setL( LObj);
....
EntityManager.persist(FLHObj);
...
}


Я получил следующее исключение

"java.lang.IllegalArgumentException: Неизвестный объект:
com.my. persistence.L$$EnhancerByCGLIB$$3e7987d0"

После некоторого изучения этого вопроса я наконец понял, что это произошло потому, что я использовал EntityManager .getReference(), что я получал вышеуказанное исключение, поскольку метод возвращал прокси.
Это заставляет меня задуматься, когда целесообразно использовать EntityManager.getReference () вместо метода EntityManager.find()?

Код: Выделить всё

EntityManager.getReference()
выдает исключение EntityNotFoundException, если не может найти искомый объект, что само по себе очень удобно. Метод EntityManager.find() просто возвращает значение null, если он не может найти объект.
Что касается границ транзакции, мне кажется, вам нужно будет использовать метод find() перед передачей вновь найденной сущности в новую транзакцию. Если вы используете метод getReference(), вы, вероятно, окажетесь в ситуации, похожей на мою, с указанным выше исключением.

Подробнее здесь: https://stackoverflow.com/questions/160 ... e-with-jpa
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»