2012-04-23 16 views
15

निस्तब्धता से पहले क्षणिक उदाहरण बचाने मैं दो संस्थाओं है: PlayerProfileEntity & UserInfoEntity मैं userInfoEntity पर एक में शामिल होने & PlaterProfileEntity और इस तरह डेटाबेस में मेरी रिकॉर्ड की बचत:वस्तु को संदर्भित एक न सहेजा गया क्षणिक उदाहरण:

Session session = sessionFactory.openSession(); 
Transaction tr = session.beginTransaction(); 
Criteria crit = session.createCriteria(PlayerProfileEntity.class); 
player.setUserId(new UserInfoEntity()); 
player.getUserId().setAddress(user.getUserId().getAddress()); 
session.save(player); 
tr.commit(); 

मैं मेरी PlayerProfileEntity कक्षा में इस assosiation इस्तेमाल किया

@ManyToOne (fetch = FetchType.LAZY) 
@Cascade({CascadeType.REFRESH}) 
@JoinColumn(name="userid") 

मैं हो रही है इस त्रुटि:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save  the transient instance before flushing: com.shared.entity.UserInfoEntity 

नोट:

Cannot add or update a child row: a foreign key constraint fails 

किसी भी विचार मैं कैसे हल कर सकते हैं इस

धन्यवाद

उत्तर

20

TransientObjectException जब भी आप उपयुक्त जॉइन को सहेजे बिना ऑब्जेक्ट को सहेजने का प्रयास करते हैं तो आता है। आपको समझना होगा ई UserInfoEntity पहले और बाद में आप अपने PlayerInfoEntity वर्ग बचा सकता है।

player.setUserId(new UserInfoEntity()); 

इस का उपयोग कर आप विशेष UserInfoEntityPlayerInfoEntity को बताए हो रहे हैं। लेकिन UserInfoEntity किसी भी आईडी नहीं है। दोनों मैप कैसे हो जाएंगे? यही कारण है कि अपवाद आ रहा है।

आशा है कि इससे आपकी मदद मिलेगी।

+0

धन्यवाद, क्या आप गाइड कर सकते हैं कि मैं userInfoEntity – user1226162

2

आप CascadeType.PERSIST का उपयोग करना चाहिए: अगर मैं CascadeType.All उपयोग करते हैं, मैं इस त्रुटि मिलती है या CascadeType.ALL

+0

धन्यवाद, लेकिन मैं पहले से ही अपने प्रश्न में उल्लिखित कैस्केड टाइप प्रकार का उपयोग कर रहा हूं और त्रुटि प्राप्त कर रहा हूं: एक बच्चे पंक्ति को जोड़ या अपडेट नहीं कर सकता: एक विदेशी कुंजी बाधा विफल हो जाती है, – user1226162

+0

पर कोई विचार मुझे खेद है, अंत में नोट देखें। मुझे लगता है, हालांकि, हमें उस त्रुटि पर ध्यान देना चाहिए जो आपको कैस्केड टाइप टाइप के साथ मिलता है। –

+0

आप 'मानदंड' से जुड़ी एक पंक्ति दिखाते हैं, लेकिन यह आपके कोड के लिए अप्रासंगिक है। दूसरी तरफ, इसमें महत्वपूर्ण कोड गुम है जो 'प्लेयर' को इकट्ठा करता है जिसे आप सहेजने जा रहे हैं। साथ ही, यह लाइन मुझे भ्रमित कर रही है: 'player.getUserId()। SetAddress (user.getUserId()।getAddress()) 'इसका क्या मतलब है? और UserId एक समग्र वस्तु कैसे आती है? –

-1

खैर,

मैं समान समस्या थी और क्या मैंने किया था

Object tmp = session.get(Object.class,ob.getId()) 
if(tmp!=null){ 
    session.evit(tmp); // or merge 
} 
session.saveOrUpdate(ob); 

यह मेरे लिए काम किया था।

यह क्षणिक वस्तु प्राप्त करता है और इसे उत्पन्न करता है या इसे विलय करता है।

अब अपनी नई वस्तु को सहेजने के लिए सहेजें या अद्यतन विधि का उपयोग करें।

+1

कैसे सहेज सकता हूं आपको इस समाधान के बारे में अधिक जानकारी देने की आवश्यकता है। इस समस्या को हल करने के बाद बेदखल कैसे किया जाता है। आमतौर पर यह समस्या सहेजी जा रही मौजूदा इकाई से जुड़ी एक इकाई को सहेजकर * नहीं * होती है। –

1
public void savePlayerMethod(PlayerInfoEntity player){ 

if(player == null){ 
    player = new PlayerInfoEntity(); 
} 
player.setUserId(getSavedUserInfo()); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 

public UserInfoEntity getSavedUserInfo(){ 
UserInfoEntity userInfo = new UserInfoEntity(); 
Session session = SessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
session.save(userInfo); 
transaction.committ(); 
} 
0

मैं जब एक न सहेजा गया उद्देश्य यह है कि के माध्यम से सत्र # बचाने() विधि निर्दिष्ट आईडी था संगृहीत करने का प्रयास अभी एक ही त्रुटि का सामना किया। मुझे लगता है कि समस्या यह हो सकती है कि आपके सहेजे गए ऑब्जेक्ट ग्राफ़ को पहले ही एक आईडी दी गई है (जो कुछ है जो सेव-विधि करने की कोशिश करता है), और यह किसी भी तरह से सेव-विधि के कैस्केड को गड़बड़ कर देता है। सत्र # का उपयोग कर जारी रहती है() के बजाय, झरना इस के साथ, काम करना चाहिए, भले ही वस्तु पहले से ही एक आईडी सौंपा गया है की कोशिश करो।

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