2013-10-24 4 views
0

Я уверен, что для этого есть спящий режим, но я не уверен, что это (и я мог бы, вероятно, найти ответ), но здесь.Как избежать запроса, вызывающего связанные объекты

У меня есть продукт Pojo, где одно из полей - это набор поставщиков (также Pojo). Когда я звоню, чтобы получить список продуктов, по умолчанию он запрашивает список поставщиков, что я и ожидал.

Однако иногда мне не требуются данные в наборе и запрос, который занимает слишком много времени, чтобы просто переносить его. Есть ли способ избежать запроса данных для Set?

Или мой дизайн неправильный?

Мои Product.hbm.xml проецируемый файл имеет:

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-access="field" default-lazy="false" package="model"> 
<class name="model.Product" table="PRODUCT"> 
    <id column="PRODUCT_ID" name="id" type="long"> 
     <generator class="native" /> 
    </id> 

    ... 

    <set name="suppliers" sort="unsorted" table="SUPPLIERS"> 
     <key column="PRODUCT_ID" /> 
    <one-to-many class="model.Suppliers" /> 
    </set> 

    ... 

</class> 
</hibernate-mapping> 
+0

Можете ли вы обновить свой вопрос с помощью файлов сопоставления спящего режима или классов сущностей, если вы используете аннотации? –

ответ

1

Поведение Hibernate по умолчанию - это то, что вы ожидаете: все коллекции, сопоставленные для сущности, и все связанные объекты, будь то через ассоциации to-many или to-one, по умолчанию не загружаются.

Но если вы определили lazy="false" для Set of Suppliers, Hibernate будет собирать соответствующую коллекцию вместе с Product.

Измените suppliers отображение, как показано ниже, так что Hibernate не будет получать его с нетерпением:

<set name="suppliers" sort="unsorted" table="SUPPLIERS" lazy="true"> 
     <key column="PRODUCT_ID" /> 
    <one-to-many class="model.Suppliers" /> 
</set> 

EDIT:

выше отображение выборки стратегия по умолчанию для suppliers. Теперь, если вы хотите загрузить suppliers вместе с Product, вы можете изменить стратегию это по умолчанию во время выполнения в коде:

String productSelect = "select p from Product " 
       + "p left join fetch p.suppliers " 
       + "where p.productName=:pname"; 
Query query = session.createQuery(productSelect); 
query.setParameter("pname", productname); 
Product result = (Product) query.uniqueResult(); 

Этот запрос будет получать Product наряду с множеством suppliers. Поэтому, когда это необходимо, вы можете переопределить стратегию по умолчанию, используя вышеуказанный запрос, чтобы получить suppliers вместе с Product.

+0

Лучше по-прежнему удалять этот default-lazy = "false" и переопределять по мере необходимости на уровне отображения или в отдельных запросах. –

+0

У меня теперь «не удалось лениво инициализировать коллекцию роли: model.Suppliers, сеанс или сеанс закрыты». Не будет ли запрос запрашивать данные по мере необходимости? – Vishal

+0

отредактировал мой ответ. Надеюсь, что это поможет вам –

0

Установите fetchtype ленивым (вместо EAGER) для набора поставщиков.

Смежные вопросы