2010-05-15 18 views
9

Hazırda bekletme, bir tamsayı alanı olan boş bir katıştırılmış nesne içeren bir nesneyi sürdürmeme izin vermiyor. Örneğin, ben benziyor Şey adlı bir sınıf varsa buHazırda bekletme, int alanı olan katıştırılmış bir nesnenin boş olmasına izin vermiyor mu?

@Entity 
public class Thing { 

    @Id 
    public String id; 

    public Part part; 

} 
Bölüm bu

@Embeddable 
public class Part { 

    public String a;  

    public int b; 

} 

sonra boş Parça nedenleri ile bir şey nesne devam çalışıyor gibi görünen bir gömülebilir sınıftır

Bir İstisna atmak için hazırda bekletme. Özellikle, bu kod

Thing th = new Thing(); 
th.id = "thing.1"; 
th.part = null; 
session.saveOrUpdate(th); 

nedenler bu istisna atmak için Hazırda

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.ace.moab.api.jobs.Thing.part 

Benim tahminim Bölüm gömülü bir sınıftır ve böylece Part.a ve Part.b basitçe sütunlar çünkü bu oluyor ki Thing veritabanı tablosunda. Thing.part boş olduğundan, Hazırda bekletme, Part.a ve Part.b sütun değerlerini, satır öğesi için null olarak ayarlamak istiyor.1. Ancak, Part.b bir tamsayıdır ve Hazırda Bekletme, veritabanındaki tamsayı sütunlarının boş olmasına izin vermez. İstisna neden olan budur, değil mi?

Bu sorun için geçici çözümler arıyorum. Part.b'nin bir int yerine çalışmak yerine çalıştığını fark ettim, ama bunun sebebi ile sizi sıkmayacağım sebepler bizim için iyi bir seçenek değil. Teşekkürler!

cevap

7

Başka bir geçici çözüm buldum ve paylaşacağımı düşündüm. Int sütunu null olarak yaparsanız, Hazırda bekletme özelliğini PropertyValueException atar.

bizim hazırda etkin uygulama veritabanını dokundu ve yarı boş yalnızca bu nedenle bu b null garanti edemez tek şey olduğu için bu bize çalışıyor
@Column(nullable = true) 
public Integer b; 

. Null bölüm önerisi ve Tamsayı sarmalayıcı türünün kullanımı büyük bir öneri olsa da, gerçekten kontrol sahibi olmadığım birçok nedenden ötürü, sütunu nilüble olarak bizim için en iyi şekilde ayarlıyoruz. Teşekkürler ve umarım bu başka birine yardımcı olur.

+0

"b" bir ilkel olduğunda int'niz nasıl olacak? –

+0

NULL olan her şey için bir sarmalayıcı sınıfı (Tamsayı) kullanmalısınız ... – Amalgovinus

1

Neler olup bittiğine dair kesinlikle haklısınız. Gömülü bir sınıfın nesnesi boş olduğunda, Hazırda bekletme, tüm sütunlarını veritabanında boş bırakarak bunu temsil eder; Maalesef, bu, Hazırda bekletme, boş bir katıştırılabilir nesne ile tüm boş değerlere sahip bir gömülebilir nesne arasındaki farkı anlayamadığı anlamına gelir.

Bildiğim kadarıyla, alanı null yapamazsanız (tahmin ettiğiniz gibi bir Integer yaparak), bunun tek yolu, özel Hazırda Bekleme türü oluşturmaktır. Yapılabilir olmalı, ama bu şekilde yapmak için bir acı olacak. Aslında, sebebi ne olursa olsun, bir Tamsayı kullanamayacağınızdan daha kötü olabilir - bu yüzden bu sebep nedir?

3

Oldukça rahatsız, evet.

private Part part = new Part(); 

veya

private Part part = Part.NULL_PART; 

bile

sizin @Embeddable sınıf (ilkel içermiyorsa o akılda

Bear (Null object patern bakınız): Sen part alan için varsayılan bir değer ayarlayabilirsiniz varsayılan değeri olan) ve bir nesneyi tüm null s ile kaydettiğinizde, tüm yapının null olarak veritabanında kalıcı olması, çünkü hazırda bekletme için bir yol olmadığını DB'de bir fark olup olmadığını bir nesneyiniz yoksa veya boş bir kutunuz varsa. Bu geçici çözüm için, ortaya çıkarsa, bir kukla alan oluşturmanız gerekir (boolean en iyisidir).

İlgili konular