Подтвердить что ты не робот

В чем разница между EntityManager.find() и EntityManger.getReference()?

В чем разница между

<T> T EntityManager.find(Class<T> entityClass, Object primaryKey) and 
<T> T EntityManager.getReference(Class<T> entityClass, Object primaryKey) 

?

Я думаю, что getReference возвращает объект, если он управляется. и находит возвращаемый объект, если он управляется иначе, выполняет SQL в базе данных, чтобы сделать его управляемым.

Пожалуйста, подтвердите.


Контекст: Из webapp я получаю первичный ключ объекта, который нужно удалить (pk типа long); для объекта должно быть удалено.

EntityManager.remove(Object entity)

передать управляемый объект методу entitymanager remove, "каков лучший и правильный вариант? find или getReference? '

4b9b3361

Ответ 1

У JPA есть понятие EntityManager, как вы знаете. Во время вашей работы в диспетчере объектов некоторые объекты загружаются из базы данных, могут быть изменены и впоследствии сброшены в базу данных.

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

getReference() разрешено возвращать прокси вместо инициализированного экземпляра, если объект ранее не был загружен в EntityManager. В этом прокси инициализируется только атрибут первичного ключа. Прокси могут быть созданы без попадания в базу данных, поскольку только инициализированный атрибут уже передан функции getReference().

Последнее полезно, когда у вас есть сущность A, ссылающаяся на объект B, и вы хотите установить b-атрибут от A до B, не загружая B из базы данных.

Только если вы ссылаетесь на другие атрибуты B, прокси-сервер будет инициализирован.

Ответ 2

getReference() не извлекает полный объект, а только прокси, и поэтому может быть более эффективным, если вы не получаете доступа к членам объекта.

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

Для JPA для правильного сохранения нового объекта необходим только первичный ключ указанного объекта. Используя getReference(), вы получаете прокси-сервер, который содержит первичный ключ, и вы сохраняете стоимость загрузки всего объекта.

Ответ 3

Книга Начиная с платформы Java EE 6 с GlassFish 3, укажите различия на стр. 135: "Поиск по идентификатору"

find() Если объект найден, он возвращается; если он не найден, возвращается нулевое значение.

MyEntity obj = em.find(MyEntity.class, id);
if(obj != null){
   // Process the object 
}

getReference() предназначен для ситуаций, когда требуется экземпляр управляемого объекта, но не доступны никакие данные, кроме потенциального первичного ключа сущности.

try {
    MyEntity obj = em.getReference(MyEntity.class, id);
    // Process the object
} catch (EntityNotFoundException e) {
    // Entity Not Found
}