Сначала зададим вопрос.
У меня есть> 4 таблицы: Customer, Address, Order, OrderItems. Каждый из них сопоставлен с использованием аннотаций Hibernate и доступен через уровень Spring DAO / Services.
То, что я пытаюсь сделать, это объединить дублирующих клиентов вместе. Таким образом, все, что действительно должно произойти, - это все заказы и адреса, связанные с клиентом B, необходимо обновить его внешний ключ customer_id, чтобы он указывал на клиента A. Тогда для клиента B должен быть установлен бит отключения.
Вместо того, чтобы отправлять эти простые запросы в нашу базу данных, hibernate сходит с ума и выдает тонну запросов на выбор, а затем обновляет. В частности, он выбирает все позиции заказа, прикрепленные к заказу (потому что это определено EAGER
, и эта точка не подлежит изменению.). Чтобы прекратить происходить выборки до обновления, я попытался добавить аннотацию спящего объекта поверх обычной javax.persistence.Entity
, например:
@org.hibernate.annotations.Entity(dynamicUpdate = true, selectBeforeUpdate = false, dynamicInsert = true)
это, похоже, никак не отразилось, за исключением простых запросов, когда обновлялись только отдельные элементы в таблице.
Я получаю объекты, используя следующие критерии гибернации:
Criteria c1 = null;
Criteria c2 = null;
Criteria c = session.createCriteria(Customer.class);
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
if(resultLimit>0) c.setMaxResults(resultLimit);
if(timeout>0) c.setTimeout(timeout);
for(String filter: sqlFilters) {
if(filter.indexOf("{alias}.customer_")!=-1) c.add(Restrictions.sqlRestriction(filter));
else if(filter.indexOf("{alias}.address_")!=-1 && addrsAttached) {
if(c1==null)
c1 = c.createCriteria("addresses").setFetchMode("type", FetchMode.JOIN);
c1.add(Restrictions.sqlRestriction(filter));
} else if(filter.indexOf("{alias}.order_")!=-1 && ordersAttached) {
if(c2==null)
c2 = c.createCriteria("orders").setFetchMode("orderItems", FetchMode.SELECT);
c2.add(Restrictions.sqlRestriction(filter));
}
}
return (List<Customer>) c.list();
Затем я перемещаю все объекты адреса и заказа от клиента B к клиенту A и запускаю
return (Customer) this.getHibernateTemplate().merge(customer);
на обоих объектах заказчика. В результате создается тонна операторов выбора, которые получают все связанные объекты (например, OrderItems, Products, ProductType, ProductPricingTmpl и т. Д.)
Мне нужно удалить эти селекты! Если бы их не было, запрос выглядел бы нормально и был бы эффективным! Обновленные выводимые запросы являются совершенными и динамичными.
Есть идеи?