2012-11-09 10 views
6

मुझे समस्या का सामना करना पड़ रहा है जहां हाइबरनेट (4.1.8.FINAL) NULL मानों (यूनिडायरेक्शनल वनटॉनी मैपिंग) के साथ एक सूची देता है।शून्य मूल्यों के साथ हाइबरनेट रिटर्न सूची (सूची प्रकार के साथ OneToMany एनोटेशन)

मुझे क्या हो रही है: मैं 21 का आकार जहां के रूप में EntryAddress 10 वीं सूचकांक पर है, और 2 एंट्री पता के साथ एक सूची हो रही 20 वीं सूचकांक पर है।

@Entity 
@Table(name = "entry") 
public class Entry { 
    ... 
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinColumn(name = "entry_id") 
    @OrderColumn(name = "precedence") 
    private List<EntryAddress> addresses; 
    ... 
} 
@Entity 
@Table(name = "entry_address") 
public class EntryAddress { 
    @Id 
    @GeneratedValue 
    @Column(name = "id") 
    private Integer id; 

    @Column(name = "entry_id") 
    private Integer entryId; 

    @Column(name = "precedence") 
    private Integer precedence; 
... 
} 

यहाँ mysql संरचना है:

Entry [addresses=[EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]] 

यहाँ कम से कम स्रोत कोड है: -

Entry [addresses=[null, null, null, null, null, null, null, null, null, null, EntryAddress [id=5, entryId=3, precedence=10, line=Line 3.1], null, null, null, null, null, null, null, null, null, EntryAddress [id=6, entryId=3, precedence=20, line=Line 3.2]]] 

मैं क्या उम्मीद मैं केवल दो EntryAddress वस्तुओं के साथ एक सूची उम्मीद (इंजन इनो डीबी):

CREATE TABLE entry (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    name varchar(500) NOT NULL, 
    active int(1) NOT NULL DEFAULT '0', 
    modifiedTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP, 
    createdTS timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

-- -------------------------------------------------------- 

CREATE TABLE entry_address (
    id int(10) unsigned NOT NULL AUTO_INCREMENT, 
    entry_id int(10) unsigned NULL, 
    precedence int(2) NULL DEFAULT '0', 
    line varchar(255) DEFAULT NULL, 
    PRIMARY KEY (id), 
    UNIQUE KEY entry_address_uq (entry_id , precedence) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

जब मैं "सेट" के साथ "सूची" को प्रतिस्थापित करने का प्रयास करता हूं तो संग्रह में शून्य मान नहीं होते हैं, लेकिन अनुक्रम/प्राथमिकता काम नहीं कर रही है।

मुझे मिला एक दिलचस्प बिंदु यह है कि, यदि मैंने पहली प्रविष्टि एड्रेस की प्राथमिकता 1 सेट की है, और 2 प्रविष्टि एड्रेस की प्राथमिकता 2 पर सेट की है तो मुझे 2 के आकार के साथ एक सूची मिल रही है। तो ऐसा लगता है कि प्राथमिकता एक भूमिका निभाती है सूची की वापसी हालांकि प्राथमिकता केवल सॉर्टिंग के लिए उपयोग की जानी चाहिए।

क्या आप कृपया मुझे बता सकते हैं कि मैं क्या गलत कर रहा हूं? धन्यवाद :-)

उत्तर

1

मैं समाधान नहीं मिला, मैं इसे इस्तेमाल किया है और इस मुद्दे

@OneToMany(orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "entry_id") 
@OrderBy("precedence") 
private List<EntryAddress> addresses; 

@OneToMany(orphanRemoval = true) 
@LazyCollection(LazyCollectionOption.FALSE) 
@JoinColumn(name = "entry_id") 
@OrderBy("precedence") 
private List<EntryContact> contacts; 
+0

कृपया अपने उत्तर पर विस्तार करें। इसके किस हिस्से ने आपकी समस्या हल की? @LazyCollection? –

2

समस्या सूची और सेट के बीच अंतर है।

मुझे 21 के आकार के साथ एक सूची मिल रही है, जहां एंट्री एड्रेस 10 वीं इंडेक्स पर है, और दूसरा प्रवेश पता 20 वीं सूचकांक पर है।

यह सुंदर सेट एक सेट है जहां इसे सूची माना जाना चाहिए!

जब आप "सेट के साथ सूची को प्रतिस्थापित करें", तो क्या आपको @OrderColumn(name = "precedence") को हटाना याद आया? क्योंकि यदि आप सेट का उपयोग कर रहे हैं, तो आपके पास ऑर्डर कॉलम नहीं हो सकता है।

+1

अपने जवाब के लिए धन्यवाद हल किया।हां, मुझे पता है कि अगर मुझे सेट का उपयोग करना है तो मुझे @ ऑर्डर कॉलम को हटाना होगा, लेकिन मैं एंटिटी एड्रेस को प्राथमिकता कॉलम से सॉर्ट करना चाहता हूं। यही कारण है कि मैं इसे सूची प्रकार के साथ कोशिश कर रहा हूं। सुझाव :-)? मैंने ऑर्डरबी एनोटेशन के साथ भी कोशिश की लेकिन वहां असफल रहा। – pitschr

13

OrderColumn की javadocs से: "आदेश स्तंभ अभिन्न प्रकार का होना चाहिए हठ प्रदाता का कहना है एक सन्निहित (गैर विरल) क्रम स्तंभ के मानों के आदेश देने जब संघ या तत्व संग्रह को अद्यतन करने।। पहले तत्व के लिए ऑर्डर कॉलम मान 0 है। "

तो, उम्मीद है कि ऑर्डर कॉलम के मान 0 से शुरू होते हैं और निरंतर मूल्य होते हैं। इसलिए, जब मान लगातार नहीं होते हैं तो हाइबरनेट आपके जावा सूची में शून्य तत्व जोड़ता है।

मुझे लगता है कि ऑर्डर कॉलम का यह व्यवहार हाइबरनेट xml मैपिंग में सूची-अनुक्रमणिका व्यवहार के समान है।

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