Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка объекта из базы в Hibernate, session.load() 
V
    Опции темы
Nofate
Дата 8.9.2009, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Возникла странная проблема:

Есть небольшой класс:

Код

public class DocumentFolder {
    private int id;
    private String name;
    private DocumentFolder parentFolder;
    private Set<DocumentFolder> subfolders;
    
    /* сеттеры геттеры */
}

и его мапинг
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="ru.arhtorg.docstore.server.domain">
    <class name="DocumentFolder" table="docstore.documentfolders">
        <id name="id" column="id">
            <generator class="sequence">
                <param name="sequence">docstore.documentfolders_id_seq</param>
            </generator>
        </id>    
        <property name="name"/>
        <many-to-one name="parentFolder" class="DocumentFolder">
            <column name="parentfolder"/>
        </many-to-one>
        <set name="subfolders" table="docstore.documentfolders" cascade="all" lazy="false">
            <key column="parentfolder"/>
            <one-to-many class="DocumentFolder"/>    
        </set>        
    </class>
</hibernate-mapping>


в dao-классе осуществляется поиск экземпляра этого класса:
Код

    public Document getDocumentById(int id) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Document result = (Document) session.load(Document.class, id);
        session.getTransaction().commit();
        return result;
    }


Метод отрабатывает без исключений, но в итоге в полях result'а всегда содержит ноли и нуллы. Хотя внутри этой javassist'овской прокси в поле target лежит найденный DocumentFolder и initialized == true.

У кого-нибудь есть идеи, почему так?

Зы. Поиском пользовался )




Это сообщение отредактировал(а) Nofate - 8.9.2009, 22:57


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
garbuz
Дата 9.9.2009, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Попробуйте использовать
Код

Document result = (Document) session.get(Document.class, id);

PM MAIL   Вверх
MisterCleric
Дата 9.9.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



garbuz говорит верно. Вот код EntityManager:
Код

public abstract class EJB3DAO<T, ID extends Serializable> implements DAO<T, ID> {
    protected Class<T> entityBeanType;
    @PersistenceContext
    protected EntityManager em;

    public EJB3DAO() {
        this.entityBeanType = (Class<T>)
                ((ParameterizedType) getClass().getGenericSuperclass())
                        .getActualTypeArguments()[0];
    }

    public T findById(ID id) {
        return em.find(entityBeanType, id);
    }
}
..........................................................................
public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable {
public <A> A find(Class<A> entityClass, Object primaryKey) {
        try {
            return (A) getSession().get( entityClass, (Serializable) primaryKey );
        }
..................................................
}
}



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Nofate
Дата 9.9.2009, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Большое спасибо, помогло.
Непонятна только суть проблемы. Load ведь должен делать то же что и get, но предварительно порывшись в кэше, чтобы базу лишний раз не напрягать. Или я что-то не так понимаю? )


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
MisterCleric
Дата 9.9.2009, 11:57 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

Load ведь должен делать то же что и get

Читаем JavaDoc org.hibernate.Session
Код

/**
     * Return the persistent instance of the given entity class with the given identifier,
     * or null if there is no such persistent instance. (If the instance is already associated
     * with the session, return that instance. This method never returns an uninitialized instance.)
     * Obtain the specified lock mode if the instance exists.
     *
     * @param clazz a persistent class
     * @param id an identifier
     * @return a persistent instance or null
     * @throws HibernateException
     */
    public Object get(Class clazz, Serializable id) throws HibernateException;


и
Код

/**
     * Return the persistent instance of the given entity class with the given identifier,
     * assuming that the instance exists. This method might return a proxied instance that
     * is initialized on-demand, when a non-identifier method is accessed.
     * <br><br>
     * You should not use this method to determine if an instance exists (use <tt>get()</tt>
     * instead). Use this only to retrieve an instance that you assume exists, where non-existence
     * would be an actual error.
     *
     * @param theClass a persistent class
     * @param id a valid identifier of an existing persistent instance of the class
     * @return the persistent instance or proxy
     * @throws HibernateException
     */
    public Object load(Class theClass, Serializable id) throws HibernateException;


Так вот. Разница в том, что load может вернуть прокси, который проинициализуруется по требованию, а не сразу.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
Nofate
Дата 9.9.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: 2
Всего: 8



Теперь все ясно. Спасибо, что помогли разобраться.


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0987 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.