#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
.