Гибернация и составной ключ

#java #hibernate #jpa

#java #переход в спящий режим #jpa

Вопрос:

Я использую Hibernate и Oracle database и просто застрял.

Я пытаюсь сопоставить эту таблицу:

 CREATE TABLE passengers_on_the_flight
(
    flight_id   NUMERIC(10) REFERENCES flight(flight_id),
    passenger_id    NUMERIC(20) REFERENCES passenger(passenger_id),
    seat        NUMERIC(5) NOT NULL,        
    CONSTRAINT "not free" PRIMARY KEY (flight_id,passenger_id,seat) 
);  
  

Итак, мой класс сопоставления выглядит следующим образом:

  @Entity
 @Table(name = "PASSENGERS_ON_THE_FLIGHT")
 @NamedQueries({
 @NamedQuery(name = "PassengersOnTheFlight.findAll", query = "SELECT p FROM PassengersOnTheFlight p")})
public class PassengersOnTheFlight implements Serializable {

private static final long serialVersionUID = 1L;


@EmbeddedId
protected PassengersOnTheFlightPK passengersOnTheFlightPK;
public PassengersOnTheFlightPK getPassengersOnTheFlightPK() {
return passengersOnTheFlightPK;
}
public void setPassengersOnTheFlightPK(PassengersOnTheFlightPK passengersOnTheFlightPK) {
this.passengersOnTheFlightPK = passengersOnTheFlightPK;
}

@JoinColumn(name = "SEAT", referencedColumnName = "SEAT", insertable = false, updatable = false)
private int seat;


@JoinColumn(name = "FLIGHT_ID", referencedColumnName = "FLIGHT_ID", insertable = false, updatable = false)
@ManyToOne
private Flight flight;


@JoinColumn(name = "PASSENGER_ID",referencedColumnName = "PASSENGER_ID",insertable = false, updatable = false)
@ManyToOne 
private Passenger passenger;

//Getters, setters for seat, flight and passanger
  

И класс первичного ключа:

 @Embeddable
public class PassengersOnTheFlightPK implements Serializable {


@Column(name = "FLIGHT_ID",nullable=false)
private long flightId;


@Column(name = "SEAT",nullable=false)
private int seat;

@Column(name = "PASSENGER_ID", nullable=false)
private Long passengerId;  

//Getters and setters for seat, flightId and passangerId
  

Я попытался что-то сохранить и получил

 ORA-00957: duplicate column name
  

Это потому, что Hibernate генерирует такой запрос:

 insert into PASSENGERS_ON_THE_FLIGHT (seat, FLIGHT_ID, PASSENGER_ID, SEAT) values (?, ?, ?, ?)
  

Я не понимаю, почему. Я что-то перепутал в классах сопоставления?

Комментарии:

1. Почему seat является частью первичного ключа? идентификаторов passenger_id и flight_id должно быть достаточно. Хотя я согласен с Полом в том, что было бы лучше иметь идентификационный ключ в таблице. Все намного проще.

2. Кроме того, место должно быть помечено как @Column, а не @JoinColumn

Ответ №1:

Я получаю ту же проблему с ключом Coposite и решил ее, добавив эти параметры в аннотацию @JoinColumn hibernate в методах получения внешних объектов-дубликатов PK:

@JoinColumn(…, обновляемый = false, вставляемый = false)

Ответ №2:

Hibernate действительно хочет, чтобы у вас был уникальный идентификационный ключ для каждой таблицы; без него у него «проблемы». Попробуйте поместить идентификационный ключ в свою таблицу.

Комментарии:

1. У него действительно есть встроенный ключ. Я что-то упускаю?

Ответ №3:

Вы получаете ошибку, потому что вы дважды указали seat. Как только вы получите его как свойство вашей сущности PassengersOnTheFlight и второй раз в ключе. Если это часть вашего ключа, удалите его из основного объекта. Если это целое число, вам, вероятно, оно все равно не нужно @JoinColumn .