2010-07-21 6 views
8
@Entity 
@Table(name = "jobitems") 
@IdClass(JobItemId.class) 
public class JobItem implements Serializable { 

@ManyToOne 
@PrimaryKeyJoinColumn(name = "forumId") 
private Forum forum; 

@ManyToOne 
@PrimaryKeyJoinColumn(name = "parsingJobId") 
private ParsingJob parsingJob; 

@Id 
@Column(name = "forumId", insertable = false, updatable = false) 
private int forumId; 

@Id 
@Column(name = "parsingJobId", insertable = false, updatable = false) 
private int parsingJobId; 

private String server; 
private String comments; 

/** 
* @param forum 
* @param parsingJob 
*/ 
public JobItem(Forum forum, ParsingJob parsingjob) { 
super(); 
setForumId(forum.getId()); 
setParsingJobId(parsingjob.getId()); 

} 

जब मैं एक उदाहरण बनाता हूं और इसे जारी रखता हूं तो मुझे निम्न अपवाद मिलता है। यह पैरामीटर के लिए रेंज के बाहर सूचकांक कहता है, इसलिए मुझे लगता है कि यह 4 के बजाय 6 पैरामीटर (मेरे 6 फ़ील्ड के लिए) जोड़ने की कोशिश करता है। क्या मुझे कुछ एनोटेशन याद आ रही हैं?एंटीटी

कोई विचार?

मैं JBoss 4.2 और MySQL

पर चलने त्रुटि संदेश के रूप में

2007-07-19 17:19:15,968 DEBUG [org.hibernate.SQL] insert into jobitems (server, comments, forumId, parsingJobId) values (?, ?, ?, ?) 
2007-07-19 17:19:15,968 INFO [org.hibernate.type.IntegerType] could not bind value '1' to parameter: 5; Parameter index out of range (5 > number of parameters, which is 4). 
2007-07-19 17:19:15,968 DEBUG [org.hibernate.jdbc.AbstractBatcher] about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
2007-07-19 17:19:15,968 DEBUG [org.hibernate.jdbc.ConnectionManager] skipping aggressive-release due to flush cycle 
2007-07-19 17:19:15,968 DEBUG [org.hibernate.util.JDBCExceptionReporter] could not insert: [com.vico.software.tools.parsing.entities.JobItem] [insert into jobitems (server, comments, forumId, parsingJobId) values (?, ?, ?, ?)] 
java.sql.SQLException: Parameter index out of range (5 > number of parameters, which is 4). 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910) 
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2740) 
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:2771) 
at com.mysql.jdbc.PreparedStatement.setInt(PreparedStatement.java:2722) 
at org.jboss.resource.adapter.jdbc.WrappedPreparedStatement.setInt(WrappedPreparedStatement.java:117) 

उत्तर

1

कि हो सकता है एक हाइबरनेट बग इस प्रकार है - नवीनतम संस्करण के लिए संभव इसे अद्यतन।

किसी भी मामले में - उन क्षेत्रों पर @Transient का उपयोग करें जिन्हें आप जारी रखना नहीं चाहते हैं।

+0

जब मैं हाइबरनेट एपीआई देखता हूं, तो एक कोड रखें: यदि (id! = Null) id => JobItemId [forumId: 2, parsingJobId: 1]। तो यह त्रुटि। I undanstand। – user397553

+0

@PrimaryKeyJoinColumn ==> @ JoinColumn, JobItemId ==> forumId ==> @ कॉलम। यह ठीक है !!! बहुत अच्छा !!! – user397553

+0

@ क्लाउड-डब्ल्यू अगर कोई जवाब आपके लिए काम करता है, तो इसे स्वीकार के रूप में चिह्नित करें। – Bozho

3

आप जेपीए 1.0 संगत मैपिंग का उपयोग कर रहे हैं, जो रिश्ते और अनावश्यक @Column फ़ील्ड समान कॉलम वाले हैं। @PrimaryKeyJoinColumn@JoinColumn(..., insertable = false, updatable = false) की तरह है, here देखें। उनमें से एक सही ढंग से काम करने के लिए लिखने योग्य होना चाहिए। जिस तरह से आपने इसे मैप किया है वह दोनों लिखने योग्य नहीं हैं।

तो मूल रूप से आपको दो बातें कर सकते हैं:

  1. रखें केवल पढ़ने के रिश्तों पर
  2. रखें केवल पढ़ने के लिए अनावश्यक @Column रों क्षेत्रों

पर ... और आप उसे निकालना दूसरे से

आप @JoinColumn के साथ @PrimaryKeyJoinColumn को प्रतिस्थापित कर सकते हैं और इसे करना चाहिए। हालांकि, हाइबरनेट को केवल पढ़ने के लिए अनावश्यक @Column फ़ील्ड पर समस्याएं होने के लिए जाना जाता है, इसलिए आपको @Column से ..., insertable = false, updatable = false) को निकालना होगा। यही कारण है कि इस अजीब अपवाद का कारण बनता है। मैं वास्तव में इसे एक बग मानता हूं। यह 4.0 सहित अधिकतम हाइबरनेट 3.x के सभी हालिया संस्करणों को प्रभावित करता है।

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