Проблема при сохранении сущности - PullRequest
8 голосов
/ 21 июля 2010
@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. Я пропускаю некоторые аннотации?

Есть идеи?

Iзапустить на 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)

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Вы используете сопоставления, совместимые с JPA 1.0, то есть отношения и избыточные поля @Column с одинаковыми столбцами. @PrimaryKeyJoinColumn похоже на @JoinColumn(..., insertable = false, updatable = false), см. здесь . Один из них должен быть доступен для записи для правильной работы. То, как вы наметили это, не доступно для записи.

Таким образом, вы можете сделать две вещи:

  1. Поместить только для чтения на отношения
  2. Поместить только для чтения в избыточные поля @Column s

... и удали его из другого.

Вы можете просто заменить @PrimaryKeyJoinColumn на @JoinColumn, и это должно сделать это. Тем не менее, Hibernate известен тем, что имеет проблемы с доступом только для чтения на избыточных @Column полях , поэтому вы должны удалить ..., insertable = false, updatable = false) из @Column s здесь. Это то, что вызывает это странное исключение. Я действительно считаю это ошибкой. Это влияет на все последние версии Hibernate 3.x вплоть до 4.0.

1 голос
/ 21 июля 2010

Это может быть ошибка гибернации - обновите ее до последней возможной версии.

В любом случае - используйте @Transient в полях, которые вы не хотите сохранять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...