Иметь параметры в методах Дао, чтобы получить сущности наиболее эффективным способом доступа только для чтения - PullRequest
1 голос
/ 16 марта 2010

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

Я хочу добавить некоторые параметры в мои методы Dao, чтобыЯ могу изменить способ, которым hibernate извлекает данные, и как он обрабатывает транзакции и т. Д.

Путем «извлечения данных» я изменяю блокировку и не испытываю беспокойства по поводу отслеживания изменений в сущностях, так как я хочу прочитать- только для чтения (без каких-либо дополнительных настроек производительности?).

Пример использования: данные на главной странице моего веб-сайта отображаются для пользователей, они доступны только для чтения, поэтомуЯ хочу избежать любого отслеживания сеанса / сущности, которое обычно выполняется в режиме гибернации.

Это данные только для чтения, они не будут изменены в этой транзакции и т. Д.

Что будет наиболееэффективный способ получить данные?

(код ниже - c # / nhibernate, я реализую это в Java, как я учусь)

public IList<Article> GetArticles()
{
    return Session.CreateCriteria(typeof(Article))
                  // some where cluase
}

Ответы [ 3 ]

0 голосов
/ 16 марта 2010

Используйте выберите новое предложение .

Как сказано в спецификации JPA

Полученные экземпляры сущности находятся в новом состоянии .

Помните, имя конструктора должно быть полностью квалифицированным .

Так что вы можете использовать

select new br.com.model.domain.User(u) from User u

Вы должны предоставить конструктор, подобный этому

public class User {

    private String name;

    // required no-arg constructor
    public User() {}

    public User(User u) {
        this.name = u.name;

         // And so on...
    }

}

Или вместо этого используйте Spring BeanUtils или Apache Commons BeanUtils, как указано ниже

public User(User u) {
    // Spring BeanUtils
    BeanUtils.copyProperties(u, this);

    // Apache Commons BeanUtils
    BeanUtils.copyProperties(this, u);
}
0 голосов
/ 18 марта 2010

Вы можете создать сеанс только для чтения в режиме гибернации:

Session session = ... // Hibernate session
session.connection().setReadOnly(true);
session.setFlushMode(FlushMode.NEVER);
// Your query...
session.connection().setReadOnly(false);
session.close();

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

0 голосов
/ 16 марта 2010

Это может быть полезно, если нет метода session.setReadOnly

http://opensource.atlassian.com/projects/hibernate/browse/HHH-2672

В качестве альтернативы посмотрите сеанс без сохранения состояния http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-statelesssession, но имейте в виду, что для этого нет поддержки кэша первого уровня или кэша второго уровня (так что это может на самом деле оказаться плохим для вашего требования.

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