views:

226

answers:

2
@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());

 }

I get the following exception when I create an instance and persist the same. It says index out of range for the parameter so I guess it tries to add 6 parameters (for my 6 fields) instead of 4. Am I missing some annotations?

Any Ideas ?

I run on JBoss 4.2 and MySql

the error message is as follows

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  A: 

That might be a hibernate bug - update it to the latest possible version.

In any case - use @Transient on the fields that you don't want to persist.

Bozho
when i look hibernate api,have a code :if(id!=null)id=>JobItemId[forumId:2,parsingJobId:1].so it error.i undanstand.
@PrimaryKeyJoinColumn==>@JoinColumn,JobItemId==>forumId==>@Column.it's ok!!!very nice!!!
@cloud-w if an answer works for you, mark it as accepted.
Bozho
I have resolved
You are not the kind of approach
@cloud-w and if there is no correct answer, provide the correct answer yourself and accept it.
Bozho
A: 

Hi,

Could you post the JobItemId.class to be sure that there aren't any error in the compound key class.

cheers

Daniel

Daniel Gartmann
public JobItemId implements Serializable{ @Column(name="forumId") private int forumId; @Column(name="parsingJobId") private int parsingJobId; ....getter..setter...hascode...equals.. ..constructor }