Problem when persisting Entity
@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开发者_StackOverflow中文版;
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)
You are using JPA 1.0 compatible mappings, that is relationships and redundant @Column
fields with the same columns. @PrimaryKeyJoinColumn
is like @JoinColumn(..., insertable = false, updatable = false)
, see here. One of them must be writable to work correctly. The way you have mapped it both aren't writable.
So basically you can do two things:
- Put read-only onto the relationships
- Put read-only onto the redundant
@Column
s fields
...and remove it from the other.
You could just replace @PrimaryKeyJoinColumn
with @JoinColumn
and this should do it. However, Hibernate is known for having problems with the read-only on redundant @Column
fields, so you have to remove the ..., insertable = false, updatable = false)
from the @Column
s here. This is what causes this strange exception. I indeed consider it a bug. This affects all recent versions of Hibernate 3.x up to including 4.0.
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.
精彩评论