2010-07-21 59 views
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) 

回答

1

這可能是一個錯誤的休眠 - 它更新到最新版本的可能。

在任何情況下 - 在您不想保留的字段上使用@Transient

+0

當我看起來hibernate api,有一個代碼:if(id!= null) id => JobItemId [forumId:2,parsingJobId:1]。 所以它error.i undanstand。 – user397553 2010-07-21 06:44:19

+0

@PrimaryKeyJoinColumn ==> @ JoinColumn, JobItemId ==> forumId ==> @ Column。 沒關係!!!非常好! – user397553 2010-07-21 07:51:45

+0

@ cloud-w如果答案適合您,請將其標記爲已接受。 – Bozho 2010-07-25 14:13:48

3

您正在使用JPA 1.0兼容映射,即具有相同列的關係和冗餘@Column字段。 @PrimaryKeyJoinColumn就像@JoinColumn(..., insertable = false, updatable = false),見here。其中一個必須可寫才能正常工作。您將它們映射的方式都不可寫。

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

  1. 看跌只讀到關係
  2. 看跌只讀到冗餘@Column S場

...並將其刪除從另一個。

您可以用@JoinColumn替換@PrimaryKeyJoinColumn,這應該做到這一點。但是,休眠因存在多餘的@Column字段上的只讀問題而出名,因此您必須在此處從@Column中刪除..., insertable = false, updatable = false)。這是什麼原因導致這個奇怪的例外。我確實認爲它是一個錯誤。這會影響Hibernate 3.x的所有最新版本,直到包括4.0。