簡體   English   中英

實體存在時的問題

[英]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;
 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)

您正在使用JPA 1.0兼容的映射,即關系和具有相同列的冗余@Column字段。 @PrimaryKeyJoinColumn就像@JoinColumn(..., insertable = false, updatable = false) ,請參閱此處 其中之一必須可寫才能正確工作。 兩者的映射方式均不可寫。

因此,基本上,您可以做兩件事:

  1. 將只讀放在關系上
  2. 將只讀設置為多余的@Column字段

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

您可以將@PrimaryKeyJoinColumn替換為@JoinColumn ,這應該可以做到。 但是, Hibernate以冗余@Column字段的只讀問題而聞名 ,因此您必須在此處從@Column刪除..., insertable = false, updatable = false) 這就是導致此奇怪異常的原因。 我確實認為這是一個錯誤。 這會影響Hibernate 3.x的所有最新版本,包括4.0。

那可能是一個休眠的錯誤-將其更新到最新的可能版本。

無論如何-在您不想保留的字段上使用@Transient

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM