Ненадежные спящие объекты - PullRequest
2 голосов
/ 16 июля 2009

Я столкнулся с ситуацией, когда объект Hibernate, возвращенный из запроса, ненадежен.

Рассмотрим следующий код:

MyClass myClass = myDAO.get(id);

myClass.getId(); //This works
myClass.getName(); //This returns null sometimes, and works sometimes

Вот мой метод получения:

@SuppressWarnings("unchecked")
public T get(ID id) 
{
    Session s = getSession();
    T entity = (T) s.load(getPersistentClass(), id);
    s.disconnect();
    return entity;
}

Теперь я понимаю, что этот объект является прокси-сервером и будет загружаться с отложенной загрузкой, но я ожидаю, что он всегда будет работать или никогда не будет работать. Я что-то здесь не так делаю?

Ответы [ 2 ]

3 голосов
/ 16 июля 2009

Это может быть или не быть причиной, но вы, вероятно, не должны использовать Session.load(), вы должны использовать Session.get().

load() возвращает постоянный экземпляр, который в данный момент загружен hibernate, и, возможно, он частично заполнен в зависимости от того, что происходило ранее.

get() более устойчивый. Попробуйте это.

1 голос
/ 16 июля 2009

Проблема в том, что «load» загрузит прокси объекта и фактически не попадет в базу данных.Однако, если объект уже был загружен (и заполнен), т. Е. В кеше уровня 1, он будет предоставлять этот экземпляр.

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

Get с другой стороны действительно попадет в базу данных.

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

Полезным упражнением было бы включить ведение журнала sql (org.hibernate.SQL = DEBUG), выполнить отладку и посмотреть, какие инструкции sql выполняются.

Вы также можете настроить постоянный объект, который вы загружаете, чтобы он не был ленивым.Таким образом, используете ли вы load или get, вы будете каждый раз получать полностью заполненный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...