Soru Hazırda bekletme: Kirli nesnelerin otomatik olarak kaydedilmesini nasıl devre dışı bırakırsınız?


Hibernate'in, işlemin sonunda kirli nesneleri otomatik olarak kaydettiğini fark ettim.

dao.save(object)

Tarafından açıklanan durumu aklımda bu konu

Sorum şu: Bu davranışı devre dışı bırakmanın bir yolu var mı? İlk bakışta bu otomatik kaydetme oldukça tehlikeli görünüyor, çünkü hangi nesnelerin oturuma bağlı olduğunu ve hangilerinin yanlışlıkla kaydedilip kaydedilmediğini bilmek gerekiyor. Bu otomatik tasarruf yaklaşımının ne gibi faydaları olduğunu söyleyebilir misiniz? Ben hiç göremiyorum. Her şeyi güncellemek için daima açık bir şekilde dao.save (object) öğesini çağırmak isterim.

OturumFactory üzerinde bir entityInterceptor kullanan bir olası çözüm, duydum. Bu özel varlıkIçıklayıcı, hiçbir zaman kirli bir şey bulamayan findDirty yöntemini geçersiz kılar, ancak bu durumda dao.save'nin de çalışmayacağını varsayalım. Herhangi bir fikir?


19
2017-10-12 12:40


Menşei


Gerçekten de hazırda bekletme konusunda en sinir bozucu şeylerden biri. Bunun yerine ebean kullanmayı düşünün :) - Hoof


Cevaplar:


Katılıyorum, el ile yıkamamanız gerekir. Webapp geliştiricisi deneyimim FushMode'un "AUTO" olarak ayarlanması gerektiğini söyledi. Ancak bazen kirli kontrolü devre dışı bırakmam gerekir (verilerin doğrulanması, veritabanındaki verilerin doğrulanması ve veri veya formlarla veri iadesi için). Bunun için FLUSHMODE'yi değiştirerek özel bir sınıf oluşturdum ve kirli bir kontrol devre dışı bıraktım.

@Component
public class ValidateRefPaysService implements IValidateRefPaysService {

    ...

    @Autowired
    @Qualifier("sessionFactory")
    private SessionFactory sessionFactory;

    @Override
    @Transactional(readOnly=true) 
    public void validate(RefPays refPays) throws BusinessException {

        try {
            sessionFactory.getCurrentSession().setFlushMode(FlushMode.MANUAL);

            if ( refPays.getId() != null ) {
                RefPays refPaysBase = refPaysDAO.getById(refPays.getId());
                if ( refPaysBase != null )  {
                    throw new BusinessException("L'id already exists in database.", "RefPays.savePays.id.alreadyexist", "refPays.savePays.id.alreadyexist");
                }
            }
        } finally {
            sessionFactory.getCurrentSession().setFlushMode(FlushMode.AUTO);
        }
    }
}

11
2018-03-07 10:13



Yalnızca varlıklarınızı doğrularsanız, neden kirli kontrolü devre dışı bırakmanız gerekir? - Mickael Marrache


Otomatik durum yönetimini devre dışı bırakmak için Oturumunuzdaki floş modunu MANUAL konumuna getirin. Daha sonra, oturumunuzla ilişkili tüm kirli varlıkları gerçekten yazmak için session.flush () yöntemini çağırabilirsiniz.


4
2017-10-13 20:34



Hmm ... Hibernate otomatik kızarmayı gerçekten devre dışı bırakmak istemiyorum - bu da Hibernate'in performansa bağlı tesislerinin faydalarını azaltmamı sağladı. Sadece, sadece açık bir şekilde dao.save veya dao.update'i aradığım kirli olan nesnelerin olmasını isterim. - machinery
Yapamazsın. IMHO, ORM için gitmenin başlıca avantajlarından biridir: Nesnelerinizin otomatik olarak kirlenmesini izlemek ve gerekli SQL'leri düzenlemek - Stefan Haberl
@StefanHaberl bu ana avantajlardan biri nasıl? Ne sıklıkla kod yazıyorsunuz ve açıkça kaydetmek istediğiniz varlıklar üzerinde "kaydetme" sorunu yaratmıyorsunuz? Ofc kirli kontrol hala orada olmalı, böylece kaydetme ve varlık kirli verirseniz, veritabanına hiçbir sorgu verilecektir. - Hoof