2010-05-07 20 views
10

Hazırda bekletme özelliğini kullanarak eşlenen bir bileşenim var. Veritabanındaki bileşendeki tüm alanlar boşsa, bileşen hazırda bekletme tarafından null olarak ayarlanır. Bu beklenen davranış ve ayrıca ihtiyacım olan şey.Hazırda bekletme koleksiyonundaki boş koleksiyon

Sahip olduğum sorun şu ki, bu bileşene bir çanta eklediğimde, çanta boş bir listeye başlatılıyor. Bu, bileşenin oluşturulmamış bileşenle sonuçlanan boş olmayan bir değere sahip olduğu anlamına gelir.

Bunu nasıl düzeltebiliriz?

Restirctions.isNull olan bir kriter ("istatistik")

<class name="foo.bar.Entity" table="Entity"> 
<id name="id" column="id"> 
    <generator class="native" /> 
</id> 

<property name="departure" column="departure_time" /> 
<property name="arrival" column="arrival_time" /> 

<component name="statistics"> 
    <bag name="linkStatistics" lazy="false" cascade="all" > 
     <key column="entity_id" not-null="true" /> 
     <one-to-many class="foo.bar.LinkStatistics" /> 
    </bag> 

    <property name="loggedTime" column="logged_time" /> 

    ... 
</component> 

beklenen değerler döndürmektedir.

+0

Lütfen içerik hakkında bilgi ekleyin: Bileşeni null olarak ayarlar? Bahsettiğin bileşen hangisi? Konteyner hangisi? –

+0

Aaron, Hazırda bekletme, bileşen özelliğini (Entity sınıfındaki istatistik) sıfırlar. –

+0

Oldukça eski bir problem gibi görünüyor ama bende var ve herhangi bir çözüm bulamadım. Bu arada şansın var mıydı? – Martin

cevap

0

Bunu doğrulamak ama işte bir fikir olamaz boş koleksiyonlar ve boş koleksiyonlar arasında, bu nedenle boş olarak davranır: boş olmayan.

İstatistik bileşeninizi bunun yerine gerçek bir varlığa dönüştürmenizi öneriyorum. Sonra foo.bar.Entity sınıfınızın null olabilen bir referansı vardır. Bu ideal değildir, çünkü İstatistik varlığını depolamak için başka bir tablo oluşturmanız gerekir, ancak boş ve boş anlam ayrımını istiyorsanız, bu onu elde etmenin bir yoludur.

+0

Bu yaklaşım gerçekten sizin için çalışıyor mu? Deneyimlerimden, sette bu tür hileler, "Hazırda başka bir koleksiyon zaten oturumla ilişkilendirilmiş" şeklinde bir istisna oluşturuyor (çünkü Hazırda bekletme, ana varlık ile ilişkilendirmeyi amaçladığı boş koleksiyonu hatırlayacaktır). Bu nedenle, varlık ayrıldığı zaman yukarıdaki kod çalışır (yüklenen oturum kapatıldı), aksi halde başarısız olur. Geterde 'null' kullanmak çok daha iyidir :) –

1

burada temel problem hazırda ayırt edemez ki ... Açıkçası

public void setListProperty(List list) { 
    if (list == null || list.size() == 0) { 
    this.listProperty = null; 
    } else { 
    this.listProperty = list; 
    } 
} 

ideal değil ama sizin için bir çözüm olabilir:

+0

Doğru. Koleksiyon kavramı, RDBMS'de gerçekten mevcut değildir, bu nedenle Hazırda Bekletme (veya herhangi bir ORM) * bir şey yapmalıdır *. –

0

Belki bu yardımcı olabilir. Boş ve boş çanta ayırt etme sorununu çözmez, ancak bu bir çözümdür. Bildiğiniz gibi, varlıkları kaydetmek veya güncellemek gibi belirli eylemleri durdurabilen bir duruşmayı tanıtabilirsiniz, bu durumda, bileşeninizin durumunu kontrol etmek için bu engelleyiciyi kullanabilir ve boşsa, hazırda bekletme kazanın diye tekrar boş bırakın. boş değerleri kaydetme. here Dokümanlar.

İlgili konular