Используя EcliplseLink JPA, как я могу отключить все поиски отношений при сохранении объекта? - PullRequest
1 голос
/ 22 февраля 2012

Когда я сохраняю объект с внешним ключом, я вижу в журналах, что eclipselink отключается и выполняет запрос проверки, например: Я также вижу, что eclipselink находит этот объект и связывает его. Я не хочу, чтобы это делало что-то из этого.

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

Примерно так:

String b_id = "12345";
A a = new A();
B b = new B();
b.setId(b_id);
a.setB(b);


//begin tran
try {
    em.persist(a);
//commit
} catch (Exception e) {
    e.printStackTrace();
    //rollback
}

, что вызывает это в логах:

Execute query DoesExistQuery(referenceClass=B)
SELECT ID FROM B WHERE (ID = ?)
bind => [12345]

Теперь я хочу вставить A без Eclipselink, чтобы проверить, существует ли B с этим Id, и я не хочу, чтобы он связывал этот B с полем A, которое является экземпляром B.

Я не хочу, чтобы Eclipselink добавил эти накладные расходы к вставке, потому что база данных все равно будет выполнять эту проверку перед вставкой, и в этом случае мне не нужен фактический экземпляр B.

Любой ответ приветствуется, спасибо!

Ответы [ 3 ]

3 голосов
/ 23 февраля 2012

Лучше всего использовать getReference.Вы также можете настроить свою политику DoesExist в своем дескрипторе (@ExistenceChecking (ASSUME_EXISTENCE)).

2 голосов
/ 22 февраля 2012

Обычно это роль метода EntityManager.getReference(): он создает и возвращает прокси для сущности, имеющей данный класс и идентификатор, без обращения к базе данных:

A a = new A();
B b = em.getReference(B.class, bId);
a.setB(b);

У меня нет опыта работы с EclipseLink, поэтому я не знаю, когда именно выполняется этот запрос.

1 голос
/ 22 февраля 2012

Каскадная аннотация в отношении A <-> B определяет этот дополнительный вызов.Возможно, у вас есть CascadeType.ALL, и вам нужны только CascadeType.REFRESH и CascadeType.REMOVE.

...