간단한 업데이트를 수행하기 위해 최대 절전 모드, 엄청난 선택 대신 업데이트

StackOverflow https://stackoverflow.com/questions/1009504

문제

먼저 질문을 설정하겠습니다.

내가 가지고있는 것은> 4 테이블 : 고객, 주소, 주문, 순서입니다. 각각은 최대 절전 모드 주석을 사용하여 매핑되며 스프링 DAO/서비스 레이어를 통해 액세스합니다.

내가하려는 것은 중복 고객을 함께 병합하는 것입니다. 따라서 실제로 발생 해야하는 모든 것은 고객 B와 관련된 모든 주문 및 주소입니다. 고객 A를 가리키기 위해 고객 _id 외국 키를 업데이트해야합니다. 그러면 고객 B는 비활성화 된 비트 설정이 있어야합니다.

이러한 간단한 쿼리를 데이터베이스에 보내는 대신 Hibernate는 미친 듯이 진행되며 톤을 선택한 다음 쿼리를 업데이트합니다. 특히 주문에 첨부 된 모든 주문 항목을 선택합니다 (이것은 정의되기 때문에 EAGER, 그리고이 시점은 변할 수 없습니다.). 업데이트가 끝나기 전에 SELECTS를 얻으려면 정규 최대 절전 모드 엔티티 주석을 추가하려고 시도했습니다. 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로 이동하고 A를 실행합니다.

return (Customer) this.getHibernateTemplate().merge(customer);

두 고객 개체 모두에서. 이것은 모든 관련 객체 (예 : OrderItems, Products, ProductType, ProductPricingTMPL 등)를 얻는 다양한 선택 문을 만들게됩니다.

이 선택을 제거해야합니다! 그들이 거기에 있지 않다면 쿼리는 정상적인 것처럼 보이고 효율적일 것입니다! 업데이트 출력 쿼리는 완벽하고 역동적입니다.

어떤 아이디어?

도움이 되었습니까?

해결책

단서는 당신이 merge () 작동을 선택할 수 있습니다. 최대 절전 모드 Javadoc에서 :

주어진 객체의 상태를 동일한 식별자로 영구 객체에 복사하십시오. 현재 세션과 관련된 지속적인 인스턴스가 없으면로드됩니다.

따라서 최대 절전 모드가 수정하기 전에 모든 데이터를로드하도록 강요합니다.

update ()와 같은 다른 조작을 시도하십시오.

주어진 분리 된 인스턴스의 식별자로 영구 인스턴스를 업데이트하십시오.

그러나 최대 절전 모드는 어쨌든 그것을로드해야한다고 결정할 수 있습니다. DynamicupDates = true 구성은 실제로 시작해야 할 사항을 알아야하기 때문에 실제로 악화 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top