@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());
}
当我创建一个实例并保持相同时,我得到以下异常。它说索引超出了参数的范围,所以我猜它试图添加6个参数(对于我的6个字段)而不是4.我是否缺少一些注释?
任何想法?
我运行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)
答案 0 :(得分:3)
您正在使用JPA 1.0兼容映射,即具有相同列的关系和冗余@Column
字段。 @PrimaryKeyJoinColumn
与@JoinColumn(..., insertable = false, updatable = false)
类似,请参阅here。其中一个必须可写才能正常工作。映射它的方式都不可写。
所以基本上你可以做两件事:
@Column
字段...并将其从另一个中移除。
您可以将@PrimaryKeyJoinColumn
替换为@JoinColumn
,这应该可以。但是, Hibernate因冗余@Column
字段上的只读问题而闻名,因此您必须从此处的..., insertable = false, updatable = false)
中删除@Column
。这就是造成这种奇怪异常的原因。我确实认为这是一个错误。这会影响所有最新版本的Hibernate 3.x,包括4.0。
答案 1 :(得分:1)
这可能是一个hibernate错误 - 将其更新为最新版本。
无论如何 - 在您不想保留的字段上使用@Transient
。