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

} 

Je reçois l'exception suivante lorsque je crée une instance et persévère même. Il dit index hors de la plage pour le paramètre donc je suppose qu'il essaie d'ajouter 6 paramètres (pour mes 6 champs) au lieu de 4. Suis-je manquer des annotations?problème lors de la persistance entité

Des idées?

Je cours sur JBoss 4.2 et MySql

le message d'erreur est le suivant

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) 

Répondre

1

Cela pourrait être un bug de mise en veille prolongée - mise à jour à la dernière version possible.

Dans tous les cas, utilisez @Transient sur les champs que vous ne souhaitez pas conserver.

+0

quand je regarde hibernate api, ai un code: if (id! = Null) id => JobItemId [ID_fichier: 2, parsingJobId: 1]. donc il erreur.i undanstand. – user397553

+0

@PrimaryKeyJoinColumn ==> @ JoinColumn, JobItemId ==> forumId ==> @ Colonne. c'est bon !!! très bien !!! – user397553

+0

@ cloud-w Si une réponse fonctionne pour vous, marquez-la comme acceptée. – Bozho

3

Vous utilisez des mappages compatibles JPA 1.0, c'est-à-dire des relations et des champs @Column redondants avec les mêmes colonnes. @PrimaryKeyJoinColumn est comme @JoinColumn(..., insertable = false, updatable = false), voir here. L'un d'eux doit pouvoir être écrit pour fonctionner correctement. La façon dont vous l'avez cartographié n'est pas accessible en écriture.

Donc, fondamentalement, vous pouvez faire deux choses:

  1. Mettre en lecture seule sur les relations
  2. Mettre en lecture seule sur les champs redondants de @Column

... et retirez-le de l'autre. Vous pouvez simplement remplacer @PrimaryKeyJoinColumn par @JoinColumn et cela devrait le faire Cependant, Hibernate est connu pour avoir des problèmes avec les champs @Column redondants en lecture seule, donc vous devez supprimer le ..., insertable = false, updatable = false) du @Column s ici. C'est ce qui provoque cette étrange exception. Je le considère en effet comme un bug. Cela affecte toutes les versions récentes d'Hibernate 3.x jusqu'à 4.0.

Questions connexes