Hibernate отключить прокси при получении = FetchType.LAZY - PullRequest
1 голос
/ 14 декабря 2010
@Entity
public class Master implements Serializable{
private List slaves;
@OneToMany(mappedBy = "Master",fetch=FetchType.LAZY)
public List getSlaves() {
   return slaves;
}
}

I want this code to pass.

List m = createQuery("from Master where id=1").getResultList();
for (Master master : m) {
    assertNull(master.getSlaves());
}

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

Есть ли способ сделать это в Hibernate или JPA?

Есть ли способ сделать это, когда fetch - EAGER?

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Бесшумный сбой прокси-серверов будет сложно отладить.

После просмотра кода hibernate, я не думаю, что у вас есть возможность настроить это.Вы можете попытаться рефлекторно вызвать collection.setInitialized(), чтобы псевдоинициализировать коллекцию, но это было бы ужасно.

0 голосов
/ 10 октября 2011

Получение в коллекции не должно возвращать ноль. Вы устанавливаете ловушку-ловушку в своем коде, возвращая значение null.

Вместо этого он возвращает пустой набор и утверждает, что набор пуст

assertTrue(master.getSlaves().size() == 0);
0 голосов
/ 14 декабря 2010

Если я правильно вас понимаю, вы хотите, чтобы мастер, который на самом деле имел РАВОВ, все равно возвращал нулевое значение для списка ведомых?Это в тестовом контексте?Вы уверены, что это именно то, что вам нужно, и что вы на правильном пути?

Еще один уродливый подход - просто явно установить нулевой список ведомых.Это гарантирует, что getSlaves () возвращает ноль, пока вы находитесь в одном сеансе, но в базе данных ничего не изменится (по крайней мере, для режима гибернации).Этот подход работает также для нетерпеливой коллекции.

...