持久化实体时出现问题

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

 }

当我创建一个实例并持久化时,出现了以下异常。它说参数的索引超出范围,所以我猜它试图添加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)
2个回答

3
您正在使用JPA 1.0兼容映射,即具有相同列的关系和冗余@Column字段。@PrimaryKeyJoinColumn类似于@JoinColumn(...,insertable = false,updatable = false),请参见here。其中一个必须是可写的才能正常工作。您映射的方式两者都不可写。因此,您可以做两件事:1.将只读放在关系上;2.将只读放在冗余的@Column字段上,并从另一个中删除它。您可以将@PrimaryKeyJoinColumn替换为@JoinColumn,这样就可以了。然而,Hibernate以在冗余的@Column字段上具有只读问题而闻名,因此您必须从@Column中删除“...,insertable = false,updatable = false” 。这就是导致这个奇怪异常的原因。我确实认为这是一个错误。这影响包括4.0在内的所有最近版本的Hibernate 3.x。

1
可能是一个Hibernate的bug,将其更新到最新的版本。
无论如何,对于不希望持久化的字段,请使用`@Transient`注解。

当我查看Hibernate API时,有一段代码:if(id!=null),其中id=>JobItemId[forumId:2,parsingJobId:1]。所以它出错了。我理解了。 - user397553
@PrimaryKeyJoinColumn ==> @JoinColumn, JobItemId ==> forumId ==> @Column。 没问题!!!非常好!!! - user397553
你不是那种方法。 - user397553
@cloud-w 如果没有正确的答案,请自己提供正确答案并接受它。 - Bozho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接