2010-07-21 12 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()); 

} 

Obtengo la siguiente excepción cuando creo una instancia y persisto de la misma. Dice que el índice está fuera de rango para el parámetro, así que supongo que intenta agregar 6 parámetros (para mis 6 campos) en lugar de 4. ¿Me faltan algunas anotaciones?Problema al persistir Entidad

¿Alguna idea?

que se ejecutan en JBoss 4.2 y MySql

el mensaje de error es como sigue

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) 

Respuesta

1

que podría ser un error de hibernación - actualizarlo a la última versión posible.

En cualquier caso, use @Transient en los campos que no desea que persistan.

+0

cuando miro hibernate api, tengo un código: if (id! = Null) id => JobItemId [forumId: 2, parsingJobId: 1]. por lo que error.i lo entiendo. – user397553

+0

@PrimaryKeyJoinColumn ==> JoinColumn, JobItemId ==> forumId ==> @ Column. está bien !!! ¡¡¡muy lindo !!! – user397553

+0

@ cloud-w si la respuesta le sirve, márquela como aceptada. – Bozho

3

Está utilizando asignaciones compatibles con JPA 1.0, es decir, relaciones y campos redundantes @Column con las mismas columnas. @PrimaryKeyJoinColumn es como @JoinColumn(..., insertable = false, updatable = false), vea here. Uno de ellos debe poder escribirse para funcionar correctamente. La forma en que lo ha mapeado no es modificable.

Así que básicamente se puede hacer dos cosas:

  1. Poner sólo lectura en las relaciones
  2. Poner sólo lectura en los campos redundantes @Column s

... y eliminarlo del otro

Usted podría simplemente reemplazar @PrimaryKeyJoinColumn con @JoinColumn y esto debería hacerlo. Sin embargo, Hibernate es conocido por tener problemas con el campo de solo lectura en los campos redundantes @Column, por lo que debe eliminar el ..., insertable = false, updatable = false) del @Column s aquí. Esto es lo que causa esta extraña excepción. De hecho, lo considero un error. Esto afecta a todas las versiones recientes de Hibernate 3.x hasta incluir 4.0.

Cuestiones relacionadas