2010-11-20 3 views
3

HI, у меня есть следующие модели:Как решить спящий режим: повторяющийся столбец в сопоставлении для объекта?

@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") 
+0

я уже пытался добавить @column (имя = «airportFrom) и @column (имя =» airportTo ") по каждому @ OneToOne, но я получил эту ошибку: «@column (s) не разрешено в свойстве @onetoone» – Neuquino

ответ

6

Это @JoinColumn вам нужно, а не @Column.

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

и т.д.

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

+0

Как я могу выполнить это в xml-сопоставлении (не аннотации)? – TheVillageIdiot

0

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

+0

Идентификатор класса не является частью проблемы, поэтому в этом нет вопроса. – Neuquino

1

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

+0

Я думаю, что это зависит от его бизнес-правила, но проблема @JoinColumn была проблемой. –

0

Использование @JoinColumn вместе с @OneToOne

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

+1

Работает, когда опция optional = false установлена. – Affe

0

Я использую это для моего стола, а не Аэропорты меня Город:

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; 
    } 
    //... 
} 
Смежные вопросы