Как решить ошибку гибернации: повторяющийся столбец в сопоставлении для сущности? - PullRequest
3 голосов
/ 21 ноября 2010

Привет, у меня есть следующая модель:

@Entity
class Flight{
  private Airport airportFrom;
  private Airport airportTo;

  @OneToOne(fetch=FetchType.LAZY,optional=false)
  public Airport getAirportFrom(){
    return this.airportFrom;
  }

  @OneToOne(fetch=FetchType.LAZY,optional=false)
  public Airport getAirportTo(){
    return this.airportTo;
  }
}

@Entity
class Airport{
  private Integer airportId;

  @Id
  public Integer getAirportId(){
    this.airportId;
  }
}

И я получаю эту ошибку:

org.hibernate.MappingException: Repeated column in mapping for entity: model.entities.Flight column: airportId (should be mapped with insert="false" update="false")

Ответы [ 5 ]

7 голосов
/ 21 ноября 2010

Вам нужен @JoinColumn, а не @ Column.

  @OneToOne(fetch=FetchType.LAZY,optional=false)
  @JoinColumn(name="airportFrom", referencedColumnName="airportId")
  public Airport getAirportFrom(){
    return this.airportFrom;
  }

и т.д.

(и, как упомянул Фротхоув, кажется, что рейсы в OneToOne с аэропортами кажутся немного странными. Я должен признаться, что обычно игнорирую домен и предполагаю, что имена - это некая чушь, облегчающая вопрос :))

1 голос
/ 21 ноября 2010

@OneToOne неверно.Это будет означать, что в каждом аэропорту есть только один рейс.Используйте @ManyToOne.И вам нужно указать столбец, который ссылается на и от идентификатора аэропорта до @JoinColumn

0 голосов
/ 17 февраля 2013

Я использую это для своей таблицы вместо аэропортов. У меня есть города:

class Tender implements java.io.Serializable {
  //...
  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "city")
  public City getCity() {
    return this.city;
  }

  @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
  @JoinColumn(name = "tour_city")
  public City getTourCity() {
    return this.tourCity;
  }
  //...
}

City implements java.io.Serializable {
  //...
  @Id
  @SequenceGenerator(name = "city_pkey", sequenceName = "city_uid_seq", allocationSize = 1)
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "city_pkey")
  @Column(name = "uid", unique = true, nullable = false)
  public int getUid() {
    return this.uid;
  }
  //...
}
0 голосов
/ 21 ноября 2010

Используйте @JoinColumn вместе с @OneToOne

Также обратите внимание, что ленивый не будет работать в этом случае.

0 голосов
/ 21 ноября 2010

Ваш класс Flight не имеет идентификатора. У организации обычно есть идентификатор, и я подозреваю, что это может быть связано с вашей проблемой.

...