Отношение внешнего ключа гибернации - list () делает ненужные SQL-запросы - PullRequest
0 голосов
/ 21 декабря 2010

Прежде всего, я впервые использую Hibernate, поэтому мои вопросы могут показаться наивными.

У меня есть две таблицы: DsJobs и DsEvents.События имеют отношение внешнего ключа к таблице DsJobs (столбец EID в таблице DsJobs соответствует столбцу ID таблицы DsEvents).

Я создал отображение с аннотациями, и меня волнует одностороннее отношение, поэтому яиметь свойство 'dsEvents' в таблице DsJobs с аннотацией @ManyToOne:

@Entity
@Table(name="DsJobs")
public class DsJobs  implements java.io.Serializable {

...

     private DsEvents dsEvents;
   ...

     @Id
    @Column(name="JID", unique=true, nullable=false)
    public long getJid() {
        return this.jid;
    }

    public void setJid(long jid) {
        this.jid = jid;
    }

@ManyToOne
    @JoinColumn(name="eid")

    public DsEvents getDsEvents() {
        return this.dsEvents;
    }

    public void setDsEvents(DsEvents dsEvents) {
        this.dsEvents = dsEvents;
    }
....
}

Я хочу получить список записей заданий из базы данных и ограничить их с помощью setFirstResult и setMaxResults.Это вызов, который я делаю:

return (ArrayList<DsJobs>) this.sessionFactory.getCurrentSession().createQuery("from DsJobs log").setFirstResult(start).setMaxResults(rows).list();

Этот код возвращает ArrayList объекта DsJobs, и внутри каждого объекта DsJobs есть объект DsEvents, правильно созданный.

У меня две проблемы:

  1. Когда я вижу, что HQL выполнен, возникают ненужные вызовы SELECT для базы данных, по одному на каждую запись DsJobs.Таким образом, для каждой записи DsJobs в DsEvents есть SELECT, чтобы получить событие coresponding по идентификатору события.Это неприемлемо для производительности, поскольку с помощью простого JDBC я могу получить все необходимые данные с помощью внутреннего SELECT-элемента SELECT.Я, вероятно, делаю что-то не так, пожалуйста, дайте мне знать, что и если вы знаете, как мне поступить.

  2. setFirstResult и setMaxResults, кажется, полностью игнорируются Hibernate, я всегда получаюзаписи из базы данных.Как я могу это исправить?

Я буду очень признателен за любую помощь.

Заранее спасибо.

Ответы [ 2 ]

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

Когда я вижу, что HQL выполнен, возникают ненужные вызовы SELECT для базы данных, по одному на каждую запись DsJobs.

Да, это страшная проблема выбора n + 1. Это происходит только тогда, когда вы применяете какое-либо ограничение RI для ваших отношений (например, однозначные или уникальные ограничения). Похоже, что отображаемое вами отображение не имеет этих проблем, из-за чего я думаю, что вы не демонстрируете нам фактическое отображение, которое вызывает у вас проблемы. Пожалуйста, опубликуйте действительный код, а не обобщенную сокращенную версию.

Hibernate полностью игнорирует setFirstResult и setMaxResults, я всегда получаю все записи из базы данных. Как я могу это исправить?

Этот код тоже подойдет. Это означает, что вы не показываете нам реальный код, который вызывает у вас проблемы.

0 голосов
/ 21 декабря 2010

Для 1 вы можете прочитать о загрузке Lazy / Eager. В вашем случае, кажется, вы хотите загружать Eager, то есть получить все данные одновременно. Смотрите эту вики-страницу для более подробной информации: http://community.jboss.org/wiki/AShortPrimerOnFetchingStrategies

Для 2 ваше использование звучит правильно. Мне нужно больше подробностей, чтобы понять, как это неправильно.

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