Как правильно отобразить отношения многие-к-одному с @IdClass? - PullRequest
0 голосов
/ 17 сентября 2018

Я хотел создать таблицу в 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. Может кто-нибудь сказать мне, почемуэто происходит?

Заранее спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

Вам не нужно целое число jugador_id в объекте partida. Возможно, у вас есть @Id в сущности jugador, отображенный в отношении @oneToMany с классом partida. Удалить это:

@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;

Убедитесь, что у вас есть что-то подобное в вашем классе Jugador.

@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "partida", referencedColumnName = "partida_id")
private Partida partida;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...