Java 持久化实体时出现问题

Java 持久化实体时出现问题,java,hibernate,orm,jpa,Java,Hibernate,Orm,Jpa,当我创建一个实例并将其持久化时,会出现以下异常。它说索引超出了参数的范围,所以我猜它尝试添加6个参数(对于我的6个字段),而不是4个。我遗漏了一些注释吗 有什么想法吗 我在JBoss4.2和MySql上运行 错误消息如下所示 @Entity @Table(name = "jobitems") @IdClass(JobItemId.class) public class JobItem implements Serializable { @ManyToOne @PrimaryKeyJoinC

当我创建一个实例并将其持久化时,会出现以下异常。它说索引超出了参数的范围,所以我猜它尝试添加6个参数(对于我的6个字段),而不是4个。我遗漏了一些注释吗

有什么想法吗

我在JBoss4.2和MySql上运行

错误消息如下所示

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

 }

这可能是一个hibernate错误-请将其更新到可能的最新版本


在任何情况下-对不希望持久化的字段使用
@Transient

您使用的是JPA 1.0兼容的映射,即具有相同列的关系和冗余
@Column
字段
@PrimaryKeyJoinColumn
类似于
@JoinColumn(…,insertable=false,updateable=false)
,请参阅。其中一个必须可写才能正常工作。映射它的方式都是不可写的

所以基本上你可以做两件事:

  • 将只读设置到关系上
  • 将只读设置到冗余的
    @列
    s字段
  • …并将其从另一个上移除


    您可以将
    @PrimaryKeyJoinColumn
    替换为
    @JoinColumn
    ,这样就可以了。但是,众所周知,Hibernate在冗余的
    @列
    字段上存在只读问题,因此您必须从
    @列
    中删除
    ..,insertable=false,updateable=false)
    。这就是导致这种奇怪异常的原因。我确实认为这是个错误。这影响到Hibernate 3.x的所有最新版本,包括4.0。

    当我查看Hibernate api时,有一个代码:if(id!=null)id=>JobItemId[forumId:2,parsingJobId:1]。所以它是错误的。i undanstand@PrimaryKeyJoinColumn==>@JoinColumn,JobItemId==>forumId=>@Column。没关系!!!很不错的!!!你不是那种approach@cloud-如果没有正确答案,请自己提供正确答案并接受。
    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)