2011-06-08 117 views
1

我使用Hibernate和Oracle数据库,只是卡住了。休眠和复合键

我试图映射此表:

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 (?, ?, ?, ?) 

我不知道为什么。我在映射类中错过了什么吗?

+0

为什么主键的座位部分? passenger_id和flight_id应该足够了。 虽然我确实同意Paul的观点,但是在桌子上放置身份证是一个更好的设计。使事情变得更简单。 – 2011-06-08 17:51:03

+0

此外,座位应该被标注为@Column,而不是@JoinColumn – 2011-06-08 17:54:11

回答

1

Hibernate真的很想让你为每个表拥有一个唯一的标识键;它没有它就有“问题”。尝试在你的桌子上放一个身份证。

+0

他确实拥有嵌入式密钥。我错过了什么吗? – 2011-06-08 20:51:16

0

你得到你的错误,因为你指定的座位两次。一旦您将其作为您的实体PassengersOnTheFlight的财产并在密钥中第二次使用。如果它是您的钥匙的一部分,请将其从主要对象中移除。如果它是一个整数,你可能不需要@JoinColumn

3

我得到了Coposite键同样的问题,解决它添加此PARAMS在@JoinColumn外部PK重复实体get方法冬眠注释:

@JoinColumn(... ,可更新= false,insertable = false