Когда использовать EntityManager.find () по сравнению с EntityManager.getReference () с JPA

Моя рекомендация состоит в том, чтобы придумать некоторые простые программы и записать им, начать заканчиваться, с помощью VI.

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

я сделал это прежде, чтобы познакомиться со средами/редакторами, и это работает вполне прилично.

, Если у Вас есть проблемы, придумывающие вещи записать, я рекомендую восстановить проекты, которые Вы сделали в школе (или что-либо еще, что Вы сделали ранее). Этот метод имеет добавленную премию разрешения Вам видеть, каким количеством из лучшего разработчика Вы стали.:)

Редактирование: забыл упоминать, что необходимо сделать это полностью от консоли для предотвращения любого искушения использовать мышь!

98
задан Vlad Mihalcea 20 June 2018 в 09:52
поделиться

1 ответ

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

public class Person {

    private String name;
    private Integer age;

}


public class PersonServiceImpl implements PersonService {

    public void changeAge(Integer personId, Integer newAge) {
        Person person = em.getReference(Person.class, personId);

        // person is a proxy
        person.setAge(newAge);
    }

}

Если я вызываю метод find , провайдер JPA за кулисами вызовет

SELECT NAME, AGE FROM PERSON WHERE PERSON_ID = ?

UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?

Если я вызову метод getReference , провайдер JPA за кулисами будет call

UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ?

И знаете почему ???

Когда вы вызываете getReference, вы получаете прокси-объект. Что-то вроде этого (провайдер JPA заботится о реализации этого прокси)

public class PersonProxy {

    // JPA provider sets up this field when you call getReference
    private Integer personId;

    private String query = "UPDATE PERSON SET ";

    private boolean stateChanged = false;

    public void setAge(Integer newAge) {
        stateChanged = true;

        query += query + "AGE = " + newAge;
    }

}

Итак, перед фиксацией транзакции провайдер JPA увидит флаг stateChanged, чтобы обновить ИЛИ НЕ лицо. Если после оператора обновления не обновляется ни одна строка,

146
ответ дан 24 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: