2010-11-20 11 views
3

HALLO, ich habe folgendes Modell:Wie Hibernate-Fehler zu lösen: Wiederholte Spalte im Mapping für Entität?

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

Und ich bin immer diese Fehlermeldung:

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

Ich habe bereits versucht @Column (name = "airportFrom) und @Column (name =" airportTo ") unter jedem hinzufügen @ OneToOne, aber ich habe diesen Fehler: "@column (s) nicht auf einer @onetoone Eigenschaft" – Neuquino

Antwort

6

Es ist @ JoinColumn Sie brauchen, nicht @Column.

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

etc

(und wie Frotthowe erwähnt, ist es ein wenig seltsam für Flüge scheinen mit Flughäfen OneToOne werden. Ich in der Regel ignorieren die Domain muss gestehen, und unter der Annahme, die Namen sind einige Pseudo-Unsinn erleichtern die Frage :))

+0

Wie kann ich erreichen dies in XML Mapping (keine Anmerkungen)? – TheVillageIdiot

0

Ihre Flight Klasse hat keine ID definiert. Es ist normal, dass eine Entität eine ID hat, und ich vermute, dass dies mit Ihrem Problem zusammenhängt.

+0

Die ID der Klasse ist es nicht Teil des Problems, deshalb ist es nicht in der Frage. – Neuquino

1

@OneToOne ist falsch. Es würde bedeuten, dass jeder Flughafen nur einen Flug hat. Verwenden Sie @ManyToOne. Und Sie müssen die Spalte an, die die vom und zum Flughafen-ID verweist von @JoinColumn

+0

Ich denke, es hängt von seiner Geschäftsregel, aber die @ JoinColumn war das Problem. –

0

Verwenden @JoinColumn zusammen mit @OneToOne

auch, dass die faulen beachten Sie wird in diesem Fall nicht funktionieren.

+1

Es funktioniert, wenn optional = false gesetzt ist. – Affe

0

Ich verwende für meine Tabelle statt Flughäfen Ich habe Städte:

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; 
    } 
    //... 
}