Comment résoudre l'erreur veille prolongée: colonne répétée dans la cartographie pour l'entité?
-
26-09-2019 - |
Question
HI, je le modèle suivant:
@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;
}
}
Et je reçois cette erreur:
org.hibernate.MappingException: Repeated column in mapping for entity: model.entities.Flight column: airportId (should be mapped with insert="false" update="false")
La solution
Il est @JoinColumn dont vous avez besoin, pas @Column.
@OneToOne(fetch=FetchType.LAZY,optional=false)
@JoinColumn(name="airportFrom", referencedColumnName="airportId")
public Airport getAirportFrom(){
return this.airportFrom;
}
etc
(et Frotthowe mentionné, il ne semble un peu étrange pour que les vols soient OneToOne avec les aéroports. Je dois avouer ignorer généralement le domaine et en supposant que les noms sont des bêtises pseudo pour faciliter la question :))
Autres conseils
@OneToOne
est erroné. Cela voudrait dire que chaque aéroport a un seul vol. Utilisez @ManyToOne
. Et vous devez spécifier la colonne qui fait référence à la provenance et à l'aéroport par id @JoinColumn
Votre classe Flight
n'a pas id défini. Il est normal pour une entité d'avoir une carte d'identité, et je soupçonne que cela peut être lié à votre problème.
Je me sers pour ma table au lieu des aéroports que j'ai Villes:
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;
}
//...
}
Utilisez @JoinColumn
avec @OneToOne
Notez également que paresseux ne fonctionnera pas dans ce cas.