Я хотел создать таблицу в Hibernate с составным первичным ключом.Одна часть первичного ключа является автоматически сгенерированным значением, а другая часть ссылается на первичный ключ другой таблицы в отношении многие к одному.
Я не использовал @EmbeddedId, потому что я не использовалудалось заставить работать автогенерацию внутри класса @Embeddable.Итак, в конце концов я решил использовать @ IdClass.
После некоторых исследований я пришел к следующему коду:
@Entity
@IdClass(PartidaId.class)
@Table(name = "partida", schema="trueskill")
public class Partida implements Serializable {
private static final long serialVersionUID = 659832134987666699L;
@Id
@GeneratedValue
@Column(name ="partida_id")
private Integer partida_id;
@Id
@Column(name = "jugador_id", insertable = false, updatable = false)
private Integer jugador_id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "jugador_id", referencedColumnName = "id")
private Jugador jugador;
@Column(name = "PUNTOS")
private int puntos;
....
}
public class PartidaId implements Serializable {
private static final long serialVersionUID = 997366452999076354L;
private Integer jugador_id;
private Integer partida_id;
...
}
Он компилируется правильно, но когда я пытаюсь сохранить одну сущность:
Jugador p1 = new Jugador("Player1");
Partida part1 = new Partida(7, p1);
em.persist(p1);
em.persist(part1);
Я получаю следующую ошибку:
17:54:31,369 DEBUG [org.hibernate.SQL] - insert into trueskill.partida (jugador_id, PUNTOS, partida_id) values (?, ?, ?)
17:54:31,374 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [1] as [INTEGER] - [1]
17:54:31,374 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [2] as [INTEGER] - [7]
17:54:31,374 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [3] as [INTEGER] - [null]
17:54:31,374 TRACE [org.hibernate.type.descriptor.sql.BasicBinder] - binding parameter [4] as [INTEGER] - [4]
17:54:31,390 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - SQL Error: 20000, SQLState: XCL14
17:54:31,390 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - Die Spaltenposition '4' befindet sich außerhalb des Bereichs. Die Anzahl der Spalten für dieses ResultSet liegt bei '3'.
17:54:31,392 ERROR [org.hibernate.internal.ExceptionMapperStandardImpl] - HHH000346: Error during managed flush [org.hibernate.exception.GenericJDBCException: could not insert: [model.Partida]]
Проблема в том, что он пытается вставить один дополнительный «нулевой» параметр, когда их должно быть только 3. Может кто-нибудь сказать мне, почемуэто происходит?
Заранее спасибо!