2016-04-20 42 views
5

ORM katmam için Hazırda Beklet özelliğini kullanıyorum. Bir işlemde HQL toplu iş kümesini çalıştırmayı deniyorum (session.update kullanamıyorum). Sorun, transaction.commit() öğesinin bile döngünün sonunda olması, güncelleme sorgularının tek tek gerçekleştirilmesidir. Bir işlemde birden çok HQL sorgusu çalıştırmanın bir yolu var mı?HQL Query kullanılarak hazırda bekleyen toplu güncelleştirme

public void updateItems() { 
    t = session.beginTransaction(); 
    for (int i = 0; i < itemList.size(); i++) { 
     Query q = createUpdateQuery(session, itemList.get(i));  
     q.executeUpdate(); //updating one by one, and not waiting for transaction commit 
    } 
    t.commit(); 
} 



Query createUpdateQuery(Session session, Item item) { 
    Query q = session.createQuery(
       "Update Item i set i.notes=:notes, i.time=:time, i.counter=:counter, i.status=:status Where i.id=:id and i.time=:time"); 

    q.setParameter("time", item.getTime()); 
    q.setParameter("status", item.getStatus()); 
    q.setParameter("notes", item.getNotes()); 
    q.setParameter("id", item.getId()); 
    return q; 
} 

Herhangi bir yardımı takdir edin.

+0

Kodunuzda açıkça yanlış bir şey göremiyorum. Güncellemeler tek tek veritabanında gerçekleşecek, ancak taahhüt verene kadar işlenmeyecek. İşlemi çağırmadan önce herhangi bir zamanda işlemi geri alabilmeniz gerekir. Bu oldukça standart. Veritabanına gidiş dönüşlerden sadece endişeli misiniz? – markwatsonatx

+0

Bir işlemin olması, büyük büyük toplu işlemde birden fazla güncelleştirme göndermesi anlamına gelmez. Ve yaklaşımınızda doğru bakmayan çok fazla şey var (keşke üretim kodunda yapacağınız şey buysa). –

+0

Cevaplarınız için teşekkürler. Bu yaklaşıma session.update (item) den geçmem gerekiyor ve performansta bir düşüş var. – Lasti

cevap

2

Tüm ifadelerinizi kaydetmek için bir veritabanı işlemi kullanıyorsunuz, ancak batch updates'u kullanmak istediğinizi düşünüyorum.

<property name="hibernate.jdbc.batch_size" value="10"/> 

Öyle olsa bile sadece entity state transitions odaklanmalıdır gibi, ifadeleri/ekleme/güncelleme yönetmek silmek için Hibernate kullanmak gerektiğini düşünüyorum:

Sadece aşağıdaki yapılandırma özelliğini ekleyin. dirty checking mechanism, değiştirilmiş varlıkları otomatik olarak algılayabilir ve Hazırda Bekletme, sizin için güncelleme deyimini oluşturabilir ve bu da çok daha uygundur.