2012-02-23 17 views
9

मेरे पास दो उदाहरण हैं जो पहले @OneToOne unidirectional मैपिंग और दूसरा बिडरेक्शनल है। यूनिडायरेक्शनल मैपिंग में, स्वामित्व वाली टीम में एक कॉलम शामिल होना चाहिए जो अन्य तालिका की आईडी को संदर्भित करता है; फिर बिडरेक्शनल में दोनों में एक-दूसरे के लिए एक विदेशी कुंजी कॉलम होना चाहिए। लेकिन स्वत: उत्पन्न रणनीति के साथ डेटाबेस स्कीमा उत्पन्न करने के बाद, दो उदाहरणों का डेटाबेस स्कीमा पर समान प्रभाव पड़ता है। यूनिडायरेक्शनल मैपिंग सामान्य है लेकिन बिडरेक्शनल उदाहरण में केवल एक विदेशी कुंजी कॉलम होता है, लेकिन इसमें एक-दूसरे की विदेशी कुंजी शामिल होनी चाहिए!@OneToOne unidirectional और bidirectional

यूनिडायरेक्शनल मानचित्रण

@Entity 
public class Customer43 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address43 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 

// Getters, Setters and Constructors. 
} 

द्वि-दिशा मानचित्रण

@Entity 
public class Customer44 { 

@Id 
@GeneratedValue 
private Long id; 
private String firstName; 
private String lastName; 
private String email; 
private String phoneNumber; 
@OneToOne 
@JoinColumn(name = "address_fk") 
private Address43 address; 

// Getters, Setters and Constructors. 
} 

@Entity 
public class Address44 { 

@Id 
@GeneratedValue 
private Long id; 
private String street1; 
private String street2; 
private String city; 
private String state; 
private String zipcode; 
private String country; 
@OneToOne(mappedBy = "address") 
private Customer44 customer; 

// Getters, Setters and Constructors. 
} 

क्यों है डेटाबेस स्कीमा उत्पादन एक ही है और क्यों करता है दिशाहीन तरह द्विदिश मानचित्रण कार्य?

उत्तर

19

क्योंकि आपको समझ में नहीं आया कि एक बिडरेक्शनल वनटोन मैप किया गया है। आपको दो विदेशी कुंजी की आवश्यकता नहीं है। एक एकल एक, एक दोनों तालिकाओं के बीच में शामिल होने के प्रदर्शन करने के लिए दोनों दिशाओं में पर्याप्त है:

select a.* from address a inner join customer c on c.addressId = a.id; 
select c.* from customer c inner join address a on c.addressId = a.id; 

तथ्य यह है कि संघ दिशाहीन है या द्विदिश नहीं बदलता कि टेबल एक साथ जुड़े हुए हैं। यह सिर्फ मानचित्रण को बदलता है, और दोनों दिशाओं में एसोसिएशन के माध्यम से नेविगेट करने की अनुमति देता है।

एक बिडरेक्शनल एसोसिएशन में, आपके पास हमेशा एक स्वामित्व वाली पक्ष होती है (जो बताती है कि एसोसिएशन कैसे मैप किया गया है, कॉलम में शामिल होने का उपयोग करके), और एक विपरीत पक्ष, जहां आप बस कहते हैं: मैं एसोसिएशन का दूसरा पक्ष हूं लक्ष्य इकाई में इस क्षेत्र (mappedBy विशेषता मान में फ़ील्ड) द्वारा मैप किया गया है।

+1

तो, उनके लिए लाभ या नुकसान क्या है? –

+9

एक यूनिडायरेक्शनल एसोसिएशन का लाभ यह है कि इसे प्रबंधित करना आसान है, क्योंकि आपको केवल एक तरफ बनाए रखना है। एक बिडरेक्शनल एसोसिएशन का लाभ यह है कि आप इसे दोनों दिशाओं में नेविगेट कर सकते हैं (किसी ग्राहक का पता प्राप्त करें, या पते के ग्राहक को प्राप्त करें)। –

+0

क्या यह OneToMany और ManyToOne पर लागू होता है? –

4

मैंने अभी इस पर एक प्रयोग किया था। तुम सिर्फ नीचे ऐसा करते हैं, दोनों तालिकाओं विदेशी कुंजी होगा:

@OneToOne 
private Address43 address; 

@OneToOne 
private Customer44 customer; 

अब आप में शामिल होने के क्या करने की जरूरत नहीं है। मुझे यकीन नहीं है कि यह एक अच्छा अभ्यास है या नहीं। बस सुनिश्चित करें कि आपके पास कैस्केड नहीं हैं।

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

  • कोई संबंधित समस्या नहीं^_^