2013-06-08 7 views
5

मैपिंग टेबल के साथ दो तालिकाओं के बीच कई संबंधों में से कई में, मैं केवल दूसरी इकाई के लिए आईडी कैसे लोड कर सकता हूं।कई से कई मैपिंग टेबल से केवल आईडी कैसे लोड करें?

उदाहरण देने के लिए उदाहरण है कि मैं यहां क्या हासिल करना चाहता हूं। नीचे एक नमूना स्कीमा है

create table user(
id int PrimaryKey, 
name text 
) 
create table pages (
id int PrimaryKey, 
page_name text 
) 
create table user_page (
id_user int, 
id_page int, 
PrimaryKey (id_user, id_page) 
) 

ध्यान दें: उपयोगकर्ता और पृष्ठ सारणी में अतिरिक्त स्तंभ जो मैं यहाँ संक्षिप्तता के लिए शामिल नहीं किया है देखते हैं।

उपयोगकर्ता इकाई:

@Entity 
@Table(name = "user") 
public class User { 
@id 
@column(name="id") 
private Integer id; 
@column(name="name") 
private String name; 
... 
... 
} 

@Entity 
@Table(name = "page") 
public class Page { 
@id 
@column(name="id") 
private Integer id; 
@column(name="page_name") 
private String name; 
... 
... 
} 

मुझे क्या करना चाहते हैं User कक्षा में एक और विशेषता Set<Integer> pageIds जोड़ सकते हैं और इस संग्रह में एक उपयोगकर्ता के लिए मैप किया गया सभी पेज आईडी है।

हाइबरनेट का उपयोग करके यह कैसे किया जा सकता है?

उत्तर

11

User वर्ग में:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

आप लौटे सेट पर पुनरावृत्ति से पहचान-पत्र प्राप्त कर सकते हैं। डिफ़ॉल्ट संग्रह से आलसी (यानी केवल आईडी) लोड होते हैं।

संपादित: यदि आप किसी कारण से Page मैप करने के लिए नहीं करना चाहते हैं, तो आप @ElementCollection इस तरह उपयोग कर सकते हैं:

@ElementCollection 
@CollectionTable(name="user_page", [email protected](name="id_user")) 
@Column(name="id_page") 
public Set<Long> pageIds; 
+1

वहाँ पृष्ठ वर्ग का उपयोग किए बिना किसी भी तरह से मैं एक सेट में केवल आईडी लोड कर सकते हैं है? यानी एक और विशेषता जोड़ें उपयोगकर्ता कक्षा में सेट करें जिसमें सभी आईडी हैं? –

+1

मेरा जवाब अपडेट किया गया। – lunr

1

मैं स्वीकार किए जाते हैं जवाब है, जब मैं दोनों मैप करने के लिए करना चाहता था के साथ एक समस्या का सामना करना पड़ा pages और pageIdsUser सहेजा गया है, संभवतः बहुत अजीब व्यवहार पैदा करने के दौरान, हाइबरनेट इन दोनों फ़ील्ड का उपयोग मैपिंग तालिका में परिवर्तन करने के लिए करेगा।

मैं बजाय solved thispageIds@Transient बनाने और संग्रह @PostLoad का उपयोग कर पॉप्युलेट द्वारा:

@ManyToMany 
@JoinTable(
    name="user_page", 
    joinColumns = @JoinColumn(name="id_user"), 
    inverseJoinColumns = @JoinColumn(name="id_page") 
) 
public Set<Page> pages; 

@Transient 
public Set<Long> pageIds; 

@PostLoad 
private void postLoad() { 
    pageIds = pages.stream().map(Page::getId).collect(Collectors.toSet()); 
} 
संबंधित मुद्दे