2013-02-14 19 views
5

पर होने मैं बस वहाँ इस तरह से मैं अपने MySQL तालिका का निर्माण हो सकता है के रूप मेंजेपीए + हाइबरनेट: कैसे एक बाधा हटाना कैस्केड

ALTER TABLE `USERINFO` 
    ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE; 

हालांकि, मैं केवल यह मेरा DDL में मिल गया है, तो सोच रहा हूँ परिभाषित करने के लिए जब हाइबरनेट ++ जेपीए शुरू होता है "<property name="hibernate.hbm2ddl.auto" value="create" />"

ALTER TABLE `USERINFO` ADD CONSTRAINT `FK_USER_ID` FOREIGN KEY (`USERID`) REFERENCES `USERACCOUNT` (`USERID`); 

मेरी कक्षाओं में होने मेरी मेज के निर्माण के लिए, मैं इन एनोटेशन सेटअप,

// UserAcc.java 
@Entity 
@Table(name = "USERACC") 
public class UserAcc implements Serializable { 

private static final long serialVersionUID = -5527566248002296042L; 

@Id 
@Column(name = "USERID") 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userId; 


@OneToOne(mappedBy = "userAcc") 
private UserInfo userInfo; 
.... 


public UserInfo getUserInfo() { 
    return userInfo; 
} 
public void setUserInfo(UserInfo userInfo) { 
    this.userInfo = userInfo; 
} 
... 

और,

// UserInfo.java 
@Entity 
@Table(name = "USERINFO") 
public class UserInfo implements Serializable { 

private static final long serialVersionUID = 5924361831551833717L; 

@Id 
@Column(name = "USERINFO_ID", nullable=false) 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Integer userInfoId; 

@OneToOne(cascade = {CascadeType.ALL}) 
@JoinColumn(name="USERID", nullable=false) 
@ForeignKey(name = "FK_USER_ID") 
private UserAcc userAcc; 


public Integer getUserInfoId() { 
    return userInfoId; 
} 

public void setUserInfoId(Integer userInfoId) { 
    this.userInfoId = userInfoId; 
} 
... 

ध्यान दें कि, उपयोगकर्ता खाता तालिका माता-पिता/मुख्य तालिका यहाँ है, जबकि UserInfo एक विस्तारित तालिका है किसी अन्य संस्था को सामान्य बनाते हैं। किसी भी उत्तर की सराहना की जाएगी। मैं सिर्फ उत्सुक हूं कि यह कैसे किया जाता है क्योंकि मुझे MySQL में भी काम करना अच्छा लगता है। मैं वास्तव में मूल तालिका (USERACOUNT) से एक रिकॉर्ड हटाने के लिए उपयोग किया जाता हूं जो मुझे माता-पिता/प्राथमिक तालिका से विशिष्ट रिकॉर्ड पर निर्भर बाल अभिलेखों के माध्यम से एक डिलीट को कैस्केड करने की अनुमति देगा।

धन्यवाद!

+0

आप इस समस्या को जेपीए का उपयोग कर के लिए एक समाधान मिला? मुझे एक ही समस्या है और मैं एक बिडरेक्शनल रिलेशनशिप का उपयोग नहीं करना चाहता, जिससे माता-पिता पर आलसी आभारी हो। –

उत्तर

5

जेपीए संबंधित इकाइयों को cascade संचालन (विलय, जारी, ताज़ा करने, निकालने) की संभावना प्रदान करता है। तर्क जेपीए में है और डेटाबेस कैस्केड का उपयोग नहीं करता है।

डेटाबेस कैस्केड के साथ कैस्केड करने के लिए कोई जेपीए मानक अनुपालन तरीका नहीं है। यदि ऐसे कैस्केड को प्राथमिकता दी जाती है, तो हमें हाइबरनेट विशिष्ट निर्माण पर वापस आना होगा: @OnDelete। यह कम से कम @OneToMany के साथ काम करता है, लेकिन अतीत में @OneToOne और @OnDelete के साथ कुछ समस्याएं होती थीं।

@OnDelete(action = OnDeleteAction.CASCADE) 
+1

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

5

जेपीए में ऐसा करने के लिए कोई साफ कटौती नहीं है। निम्नलिखित आपको प्राप्त होगा जो आप चाहते हैं ... आप CascadeType.DELETE का उपयोग कर सकते हैं, हालांकि यह एनोटेशन केवल EntityManager में डेटाबेस पर लागू होता है, डेटाबेस नहीं। आप यह सुनिश्चित करना चाहते हैं कि ON DELETE CASCADE डेटाबेस बाधा में जोड़ा गया है। सत्यापित करने के लिए, आप एक डीडीएल फ़ाइल उत्पन्न करने के लिए जेपीए को कॉन्फ़िगर कर सकते हैं। ddl फ़ाइल पर एक नज़र डालें, आप देखेंगे कि ON DELETE CASCADE बाधा का हिस्सा नहीं है। ddl फ़ाइल में वास्तविक SQL में जोड़ें, फिर ddl से अपना डेटाबेस स्कीमा अपडेट करें। यह आपकी समस्या को ठीक करेगा।

यह link दिखाता है कि ON DELETE CASCADE पर CONSTRAINT के लिए MySQL में कैसे उपयोग करें। आप इसे बाधा पर करते हैं। आप इसे CREATE TABLE या ALTER TABLE कथन में भी कर सकते हैं। यह संभावना है कि जेपीए ALTER TABLE कथन में बाधा उत्पन्न करता है। बस उस कथन में ON DELETE CASCADE जोड़ें।

ध्यान दें कि कुछ जेपीए कार्यान्वयनकर्ता इस कार्यक्षमता के लिए साधन प्रदान करते हैं।

आखिरकार, हाइबरनेट OnDelete(action = OnDeleteAction.CASCADE) एनोटेशन का उपयोग करके इस कार्यक्षमता की आपूर्ति करता है।

1

आप UserAcc.userInfo पर हाइबरनेट एनोटेशन [email protected](action = OnDeleteAction.CASCADE) उपयोग कर सकते हैं:

public class UserAcc implements Serializable { 

... 

@OneToOne(mappedBy = "userAcc") 
@OnDelete(action = OnDeleteAction.CASCADE) 
private UserInfo userInfo; 

... 

इस UserInfo तालिका में विदेशी कुंजी पर DDL ON DELETE CASCADE उत्पन्न होगा।

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