2012-07-07 16 views
5

का उपयोग कर जेएक्स-आरएस के लिए हाइबरनेट संसाधन कक्षाओं में तालिका में शामिल होने के साथ कई-टू-वन मैं जर्सी का उपयोग कर एक विश्वसनीय वेब सेवा लागू कर रहा हूं। मैं डेटाबेस (mySQL) के साथ संवाद करने के लिए हाइबरनेट का उपयोग करता हूं। मेरे हाइबरनेट संसाधन वर्गों में शामिल हैं:जर्सी

@Entity 
public class Activity { 

    @Id 
    @GeneratedValue 
    private long id; 

@ManyToOne 
    @JoinTable(name="category_activity", 
    joinColumns={@JoinColumn(name="activities_id")}, 
    inverseJoinColumns={@JoinColumn(name="Category_id")}) 
    private Category category; 
} 

और श्रेणी वर्ग:

@Entity 
public class Category { 

    @Id 
    @GeneratedValue 
    private long id; 

    @OneToMany 
    @Fetch(FetchMode.JOIN) 
    @JoinTable(name = "category_activity", 
    joinColumns = { @JoinColumn(name = "Category_id") }, 
    inverseJoinColumns = { @JoinColumn(name = "activities_id") }) 
    @JsonIgnore 
    private Collection<Activity> activities; 
} 

मैं इस प्रश्न के लिए प्रयोग किया जाता ativities लाने के लिए:

session.createQuery("from Activity a join a.category cs where cs.id= :categoryId order by a.key").setLong("categoryId", categoryId).list(); 

JSON प्रारूप में परिणाम सही तरह नहीं है :

[[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}},{"id":10,"name":"General","description":""}]] 

जैसा कि आप देखते हैं कि श्रेणी 2 बार मुद्रित होती है और हमारे पास एक अतिरिक्त [] है। जब मैं की तरह श्रेणी वर्ग में एक-से-अनेक संबंध का एक और तंत्र का उपयोग करें:

@OneToMany(targetEntity = Activity.class, mappedBy = "category", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JsonIgnore 
private Collection<Project> activities; 

और गतिविधि कक्षा में:

@ManyToOne(optional = false) 
    private Category category; 

और इस क्वेरी:

session.createQuery("from Activity as a where a.category.id= :categoryId order by a.key").setLong("categoryId", categoryId).list(); 

सब कुछ काम करता है ठीक। लेकिन मुझे जॉइन टेबल का उपयोग करना है क्योंकि मुझे लगता है कि डेटाबेस को बदलना नहीं है।

उचित परिणाम देखने के लिए की तरह करना चाहिए:

[{"id":26,"key":"other","name":"Other","cost":100.0,"category":{"id":10,"name":"General","description":""}}] 

मैं किसी भी मदद के लिए सराहना करते हैं।

उत्तर

9

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

एक द्विदिश संघ हमेशा एक मालिक की ओर (जहां स्तंभ में शामिल होने या उपयोग करने के लिए टेबल, और एक व्युत्क्रम पक्ष जो कहते हैं टोपी यह दूसरी तरफ का प्रतिलोम है mappedBy विशेषता का उपयोग करके शामिल हो निर्दिष्ट है:

public class Activity { 

    @ManyToOne // owner side: it doesn't have mappedBy, and can decide how the association is mapped: with a join table 
    @JoinTable(name="category_activity", 
       joinColumns={@JoinColumn(name="activities_id")}, 
       inverseJoinColumns={@JoinColumn(name="Category_id")}) 
    private Category category; 
} 

public class Category { 
    @OneToMany(mappedBy = "category") // inverse side: it has a mappedBy attribute, and can't decide how the association is mapped, since the other side already decided it. 
    @Fetch(FetchMode.JOIN) 
    @JsonIgnore 
    private Collection<Activity> activities; 
} 

संपादित करें:

इसके अलावा, आपकी क्वेरी केवल गतिविधि का चयन करना चाहिए, और सभी संस्थाओं क्वेरी से जुड़े हुए है, एक का चयन खंड जोड़कर:

select a from Activity as a where a.category.id= :categoryId order by a.key 
+0

मैं apprec प्रतिक्रिया के लिए iate। आपके द्वारा उल्लिखित समाधान में एक ही समस्या थी। – Ali

+0

मेरा संपादित उत्तर –

+0

देखें अब यह पूरी तरह से काम कर रहा है। – Ali

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