2014-07-09 7 views
9

में एम्बेडेड सदस्य के सदस्यों पर अद्वितीय बाधाएं क्या हाइबरनेट में एम्बेडेड क्लास के सदस्यों पर अद्वितीय बाधाओं को परिभाषित करना संभव है?हाइबरनेट

मैं

@Entity 
@Table(uniqueConstrains = ???) 
public class Widget { 
    @Id 
    private int id; 

    @Embedded 
    Nested nested; 
} 

@Embeddable 
public class Nested { 
    private int i1; 
    private int i2; 
} 

उत्तर

5

यह संभव है का उपयोग करके यह सुनिश्चित करें कि नेस्टेड :: i1 और नेस्टेड :: i2 (संयोजन) एक जोड़ी के रूप में अद्वितीय हैं होने की जरूरत:

@Entity 
@Table(uniqueConstraints = { @UniqueConstraint(columnNames = {"i1", "i2"})}) 
public class Widget { 

यह होगा CREATE एसक्यूएल (PostgreSQL उदाहरण)

create table Widget 
( id int8 not null, 
    i1 int8, 
    i2 int8 , 
    primary key (id), 
    unique (i1, i2) 
) 

वैकल्पिक रूप में परिणाम - यह शायद अधिक consise होगा और पठनीय है जब आप एक फ़ाइल में @AttributeOverride एनोटेशन specyfying जोड़ने - दोनों के लिए स्तंभ नाम का श्रेय

@AttributeOverrides({ 
     @AttributeOverride(name = "i1", column = @Column(name = "i1")), 
     @AttributeOverride(name = "i2", column = @Column(name = "i2")) 
}) 
@Embedded 
Nested nested; 
+0

Thnaks, इस महान है। एक बात मुझे बहुत चिंतित करती है, यह है कि अगर 'नेस्ड' परिवर्तन के क्षेत्र के नाम, एम्बेडेड के रूप में इसका उपयोग करने वाले किसी वर्ग को समस्या होगी ... उस समस्या को हल करने के लिए कोई पैटर्न? –

+0

@JoshuaMN दुर्भाग्यवश इसके लिए कोई पैटर्न नहीं है, लेकिन संभावना है कि 'नेस्टेड' वर्ग के फ़ील्ड उनके नाम बदल जाएंगे, एम्बेडेड कक्षाओं के उपयोग के बजाय छोटे नामों का उद्देश्य है। आप इस मामले में '@ AttributeOverride' के विचार को भी त्याग सकते हैं, इसका मतलब यह नहीं है (मुझे लगता है कि कोड का उपयोग करते समय कोड अधिक कंसोल है)। –