Какой запрос я должен использовать в Hibernate для получения POJO? - PullRequest
0 голосов
/ 22 сентября 2010

Я выучил Hibernate и использовал его, чтобы значительно сократить свой Java-код, а также смог сократить время, затрачиваемое на БД. Теперь, какой тип запроса я должен использовать, чтобы закончить операции для получения списка БД для отображения, для обновления и удаления.

Мой код для удаления:

String newToken = "DELETEUSER";
if(!TokenManager.checkRoleToken(newToken)){
    return;
}
Session session = Main.getSession(); //calling the main method to get sesion 
Leavetable table = new Leavetable; // intialisation of object table
try{
    Transaction tr = session.beginTransaction();
    table = session.createQuery();
    session.delete(table); // deletion of the object and its properties  from selected leaveID
    tr.commit();            
}
finally{
    session.close();
}

Мой код для обновления базы данных

public void updateLeaveTable( Leavetable leave ) {
    String newToken = "ADDUSER";
    if( !TokenManager.checkRoleToken( newToken ) ) {
        return;
    }
    Session session = Main.getSession(); // calling the main method to get
                                         // session
    try {
        session = Main.getSession();
        Transaction tr = session.beginTransaction();
        session.saveOrUpdate( leave ); // here without query the table gets
                                       // updated How?
        tr.commit();
    }
    finally {
        session.close();
    }
}

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

1 Ответ

3 голосов
/ 22 сентября 2010

Вы имеете в виду HQL-запрос?Что ж, типичный запрос к вашей Leavetable сущности будет выглядеть так:

Query q = session.createQuery("from Leavetable t where t.someField = :value");
q.setParameter("value", foo);
List<Leavetable> results = q.list();

Однако, если вы просто хотите получить сущность по идентификатору, см. Session#load() или Session#get().Я не хочу, чтобы все было слишком запутанным, но хотя оба метода похожи, между ними есть важное различие.Цитирование Форумы Hibernate :

Получение объектов по идентификатору

Следующий фрагмент кода Hibernate извлекает объект User из базы данных:

User user = (User) session.get(User.class, userID);

Метод get() является специальным, поскольку идентификатор уникальным образом идентифицирует один экземпляр класса.Следовательно, приложения обычно используют идентификатор в качестве удобного дескриптора постоянного объекта.Извлечение по идентификатору может использовать кеш при извлечении объекта, избегая попадания в базу данных, если объект уже кеширован.Hibernate также предоставляет метод load():

User user = (User) session.load(User.class, userID);

Метод load () старше;get () был добавлен в API Hibernate по запросу пользователя.Разница тривиальна:

Если load() не может найти объект в кэше или базе данных, возникает исключение.Метод load () никогда не возвращает ноль.Метод get() возвращает null, если объект не может быть найден.

Метод load() может возвращать прокси вместо реального постоянного экземпляра.Прокси-сервер - это заполнитель, который запускает загрузку реального объекта при первом обращении к нему;мы обсудим прокси позже в этом разделе.С другой стороны, get() никогда не возвращает прокси.

Выбор между get() и load() очень прост: Если вы уверены, что постоянный объект существует, и его не существуетсчитаться исключительным, load() хороший вариант.Если вы не уверены, что существует постоянный экземпляр с данным идентификатором, используйте get() и проверьте возвращаемое значение, чтобы увидеть, является ли оно нулевым.Использование load() имеет еще одно значение: приложение может получить действительную ссылку (прокси) на постоянный экземпляр, не обращаясь к базе данных, чтобы получить его постоянное состояние.Так что load() может не выдавать исключение, если оно не находит постоянный объект в кеше или базе данных;исключение будет выдано позже при доступе к прокси.

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

См. также HibernateДокументация (ссылки ниже).

Справочник

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