2015-06-22 9 views
11

मैं विदेशी कुंजी संदर्भ के साथ दो तालिकाओं है:लापता पंक्तियों

Comm TABLE: 

+----+------------+ 
| ID | NAME | 
+----+------------+ 
| 1 | comm name1 | 
| 2 | comm name2 | 
| 3 | comm name3 | 
+----+------------+ 

LOCATION TABLE: - COMM_ID FK to Comm --> id 

+---------+------+-----+ 
| COMM_ID | FORM | TO | 
+---------+------+-----+ 
|  1 | 720 | 721 | 
|  1 | 725 |  | 
|  1 |  | 766 | 
|  1 |  |  | 
|  2 | 766 | 225 | 
|  3 | 766 | 222 | 
+---------+------+-----+ 

समस्या हाइबरनेट SET<location> सभी पंक्तियों में location लापता जहां कोई FROMके साथ मेरी कॉम वस्तु देता है औरTO (तालिका LOCATION में COMM_ID = 1 के साथ अंतिम पंक्ति की तरह) गायब हैं।

अन्यथा (अगर FROM या TO में से केवल एक) पंक्ति वापस आती है ... क्यों?

Comm वस्तुओं:

@ElementCollection 
@CollectionTable(name="LOCATION",[email protected](name="COMM_ID")) 
public Set<LOCATION> getLocations(){ 
    return locations; 
} 
public void setLocations(Set<LOCATION> locations){ 
    this.locations=locations; 
} 

Location वर्ग:

@Embeddable 
class Location implements java.io.Serializable { 

    private BigDecimal fromLocationId; 
    private BigDecimal toLocationId; 

    public Location() { 
    } 

    public Location(BigDecimal fromLocationId, BigDecimal toLocationId) { 
     this.fromLocationId = fromLocationId; 
     this.toLocationId = toLocationId; 
    } 

    @Column(name="FROM", nullable=true, precision=22, scale=0) 
    public BigDecimal getFromLocationId() { 
     return this.fromLocationId; 
    } 

    public void setFromLocationId(BigDecimal fromLocationId) { 
     this.fromLocationId = fromLocationId; 
    } 

    @Column(name="TO", nullable=true, precision=22, scale=0) 
    public BigDecimal getToLocationId() { 
     return this.toLocationId; 
    } 

    public void setToLocationId(BigDecimal toLocationId) { 
     this.toLocationId = toLocationId; 
    } 

    @Override 
    public int hashCode() { 
     return com.google.common.base.Objects.hashCode(fromLocationId, toLocationId); 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj == null || getClass() != obj.getClass()) { 
      return false; 
     } 
     final LOCATION other = (LOCATION) obj; 
     return com.google.common.base.Objects.equal(this.fromLocationId, other.fromLocationId) && com.google.common.base.Objects.equal(this.toLocationId, other.toLocationId); 
    } 
} 

मैं हाइबरनेट उपयोग कर रहा हूँ - 4.3.6

लॉग इन करें:

org.hibernate.SQL - 
    select 
     locations0_.COMM_ID as COMM_ID1_2_0_, 
     locations0_.FROM as FROM2_8_0_, 
     locations0_.TO as TO4_8_0_ 
    from 
     LOCATION locations0_ 
    where 
     locations0_.COMM_ID=1 

मैंने इसे अपने डीबी में चेक किया और यह सही परिणाम देता है।

+0

क्या मुझे कुछ याद आ रही है? आपका डेटा स्ट्रिंग्स से होने और दिखाने के लिए दिखाता है, लेकिन आप मैपिंग कहते हैं कि उन्हें संख्याएं होनी चाहिए ???? –

+0

क्षमा करें मैं इसे ठीक करता हूं .. – user986474

+0

कृपया संपूर्ण 'LOCATION' कक्षा पोस्ट करें। चूंकि आप 'सेट' का उपयोग कर रहे हैं, इसलिए यह अनिवार्य है कि आप 'बराबर' और 'हैशकोड' विधि को सही तरीके से ओवरराइड करते हैं। – Tom

उत्तर

2

वास्तव में, आउटपुट में कुछ भी गलत नहीं है। मुझे लगता है कि आप embeddable और entity के बीच उलझन में हैं। क्योंकि, जहां तक ​​मुझे पता है। यदि आप एक ही फ़ील्ड का उपयोग करते हुए बहुत सारी इकाई हैं तो आप केवल एक इकाई के विकास को आसान बनाने के लिए केवल वर्ग का उपयोग करें।

और जो मैं देखता हूं, उससे hashcode और equals विधियां उन सभी छः रिकॉर्डों को एक अलग रिकॉर्ड के रूप में मानती हैं। इसलिए, मुझे लगता है कि आप क्या चाहते हैं Location कक्षा इस तरह से कुछ बनाना है।

@Entity 
class Location implements java.io.Serializable { 

private Long commId; 
private BigDecimal fromLocationId; 
private BigDecimal toLocationId; 

// all the setter getter here 

@Override 
public int hashCode() { 
    return com.google.common.base.Objects.hashCode(commId); 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null || getClass() != obj.getClass()) { 
     return false; 
    } 
    final LOCATION other = (LOCATION) obj; 
    return com.google.common.base.Objects.equal(this.commId, other.commId); 
} 
} 

या, बेशक आप प्राप्त विधि एक List वापस जाने के लिए और अगर पंक्ति from या to मान अनुपलब्ध है तो एक पंक्ति को दूर कर सकते हैं।

2

एक एम्बेड करने योग्य ऑब्जेक्ट का डेटा अपने माता-पिता की तालिका में कई स्तंभों में निहित है। चूंकि कोई भी फ़ील्ड मान नहीं है, इसलिए यह जानने का कोई तरीका नहीं है कि एम्बेड करने योग्य के माता-पिता का संदर्भ शून्य है या नहीं। कोई यह मान सकता है कि यदि एम्बेड करने योग्य के प्रत्येक फ़ील्ड मान शून्य है, तो संदर्भ शून्य होना चाहिए, लेकिन तब सभी शून्य मानों के साथ एम्बेड करने योग्य का प्रतिनिधित्व करने का कोई तरीका नहीं है। जेपीए एम्बेडेड को शून्य होने की इजाजत नहीं देता है, लेकिन कुछ जेपीए प्रदाता इसका समर्थन कर सकते हैं।

हाइबरनेट: किसी इकाई को लोड करते समय, एम्बेड किए गए संदर्भों को शून्य में सेट किया जाता है यदि एम्बेड करने योग्य सभी कॉलम शून्य हैं।

अधिक जानकारी click here

के लिए

इसलिए जब यू नल एम्बेड करने योग्य मान बचत तो बचाने लेकिन हाइबरनेट प्राप्त करते समय उन पंक्तियों को जो व्यर्थ हैं त्यागने के समय में करने की अनुमति हाइबरनेट।

संबंधित मुद्दे