Hibernate ScrollableResults через HQL требует выборки левого соединения для каждой ассоциации

Надеюсь, вам поможет какой-нибудь гуру Hibernate.

У меня есть объектная структура, которая выглядит так:

class Customer {
    private Stuff1 stuff1;
    private Stuff2 stuff2;

    // Bazillion other fields
}

class Report {
    private Customer customer;
    private String uniqueBatchId; 

    // Bazillion other fields 
}

class AbstractSpecialReport {
    private Report report;

    //Bunch of other fields
}

class SpecialReport extends AbstractSpecialReport{
    private List<ReportParts> reportParts;           
}

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

Я хочу использовать этот HQL для получения результатов, используя ScrollableResults, Я сделал необходимые заклинания, чтобы получить набор результатов для потоковой передачи.

select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId

Но я получаю "java.sql.SQLException: набор результатов потоковой передачи com.mysql.jdbc.RowDataDynamic@633f8d4f по-прежнему активен. Никакие операторы не могут быть выданы, когда любые наборы результатов потоковой передачи открыты и используются для данного подключения. Убедитесь, что у вас есть вызывается.close() для всех активных наборов результатов потоковой передачи, прежде чем предпринимать дополнительные запросы. "

У меня есть вход в SQL-запрос, и я ясно вижу, что он пытается получить несвязанное свойство в отчете после прокрутки вперед.

Поэтому я начал расширять свой HQL, чтобы включить эти поля.

Теперь похоже

select srpt
from SpecialReport as srpt
left join fetch srpt.report as rpt
left join fetch rpt.customer as cst
left join fetch rpt.field1
left join fetch rpt.field2
left join fetch rpt.field3
left join fetch rpt.field4 as child
-- now field 4 was an object that also has fields that are associations.
left join fetch child.field1
left join fetch child.field2
-- ad nauseum, this keeps going down the object tree 
left join fetch cst.stuff1
left join fetch cst.stuff2
where rpt.uniqueBatchId = :batchId

Даже после 25 соединений у меня все еще есть загружаемые поля, вызывающие то же исключение. Я мог бы продолжать вручную ходить по графику, но это занимает вечность, и я чувствую, что в этом не должно быть необходимости. Просматривая код Hibernate, кажется, TwoPhaseLoad Вызванная прокруткой попытка инициализировать все прокси и лениво загруженные поля в объектах, что обязательно нарушает требование, чтобы никакие другие запросы sql не выполнялись во время выполнения прокрутки. Имеет ли это смысл для кого-то там?

1 ответ

Ассоциации XxxToOne стремятся по умолчанию. Аннотируйте их как ленивые, если вы не хотите, чтобы Hibernate загружал их с нетерпением.

Более того, SpecialReport является отчетом, поэтому следующее объединение не имеет особого смысла:

from SpecialReport as srpt
left join fetch srpt.report as rpt
Другие вопросы по тегам